`
kiki1120
  • 浏览: 307639 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

java解析证书的例子(包括基本项目、扩展项目)

阅读更多
package ciso.security.test;

/**
* <p>Title: Light Weight APIs for crypto </p>
* <p>Description: 一个上海CA证书(根证书和用户证书)进行处理的例子</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: 中国信息安全组织(CISO) </p>
* @author rainbow(webmaster)
* @version 1.0.2003.0620
*/
import java.io.*;


import org.bouncycastle.asn1.*;
import org.bouncycastle.asn1.util.*;
import org.bouncycastle.asn1.x509.*;
import org.bouncycastle.util.encoders.*;
public class CertManager {
  String eoid[][]={
            {new String("Subject Key Identifier"), new String("2.5.29.14")},
            {new String("Key Usage"),           new String("2.5.29.15")},
            {new String("Private Key Usage Period"),new String("2.5.29.16")},
            {new String("Subject Alternative Name"),new String("2.5.29.17")},
            {new String("Issuer Alternative Name"), new String("2.5.29.18")},
            {new String("Basic Constraints"),     new String("2.5.29.19")},
            {new String("CRL Number"),         new String("2.5.29.20")},
            {new String("Reason code"),         new String("2.5.29.21")},
            {new String("Hold Instruction Code"),   new String("2.5.29.23")},
            {new String("Invalidity Date"),       new String("2.5.29.24")},
            {new String("Delta CRL indicator"),   new String("2.5.29.27")},
            {new String("Issuing Distribution Point"),new String("2.5.29.28")},
            {new String("Certificate Issuer"),     new String("2.5.29.29")},
            {new String("Name Constraints"),     new String("2.5.29.30")},
            {new String("CRL Distribution Points"), new String("2.5.29.31")},
            {new String("Certificate Policies"),   new String("2.5.29.32")},
            {new String("Policy Mappings"),       new String("2.5.29.33")},
            {new String("Authority Key Identifier"),new String("2.5.29.35")},
            {new String("Policy Constraints"),     new String("2.5.29.36")},
            {new String("Extended Key Usage"),     new String("2.5.29.37")}};
  byte buf[];
  public CertManager() {
    int fLength=0;
    try {
        FileInputStream fis=new FileInputStream("..\\mycert\\ca.der");
        fLength=fis.available();
        buf=new byte[fLength];
        fis.read(buf,0,fLength);
    }
    catch (Exception ex) {
        System.out.println("读证书文件出错!");
        return;
    }
  }
  public byte[] getExtensionBytes(String oid,X509Extensions exts)
  {
    if (exts != null)
    {
        X509Extension   ext = exts.getExtension(new DERObjectIdentifier(oid));
        if (ext != null)
        {
          return ext.getValue().getOctets();
        }
    }
    return null;
  }
  public void getCert()
  {

    ByteArrayInputStream   bIn;
    DERInputStream       dIn;
    String             dump = "";

    try
    {
        bIn = new ByteArrayInputStream(buf);
        dIn = new DERInputStream(bIn);

        ASN1Sequence     seq = (ASN1Sequence)dIn.readObject();
        //dump = DERDump.dumpAsString(seq);
        // 调试输出语句
        //System.out.println(dump);
        // 证书的基本信息
        System.out.println("<<=============证书的基本信息===============>>");
        X509CertificateStructure   cert = new X509CertificateStructure(seq);
        System.out.println("证书版本:\t"+cert.getVersion());
        System.out.println("序列号:\t\t"+cert.getSerialNumber().getValue().toString(16));
        System.out.println("算法标识:\t"+cert.getSignatureAlgorithm().getObjectId().getId());
        System.out.println("签发者:\t\t"+cert.getIssuer());
        System.out.println("开始时间:\t"+cert.getStartDate().getTime());
        System.out.println("结束时间:\t"+cert.getEndDate().getTime());
        System.out.println("主体名:\t\t"+cert.getSubject());
        System.out.print("签名值:\t");
        DERBitString signature=cert.getSignature();
        String strSign=new String(Hex.encode(signature.getBytes()));
        System.out.println(strSign);
        System.out.println("主体公钥:\t");
        SubjectPublicKeyInfo pukinfo=cert.getSubjectPublicKeyInfo();
        System.out.println("\t标识符:\t"+pukinfo.getAlgorithmId().getObjectId().getId());
        byte[] byPuk=pukinfo.getPublicKeyData().getBytes();
        String strPuk=new String(Hex.encode(byPuk));
        System.out.println("\t公钥值:\t"+strPuk);
        // 证书的扩展信息
        System.out.println("<<===========证书的扩展信息==============>>");
        X509Extensions ext=cert.getTBSCertificate().getExtensions();
        // 15 --key usage     19 ---basic constrains
        // 31-- crl point     32 ---certificate policy
        getKeyUsage(ext);
        getBasicConstrains(ext);
        getCRLPoint(ext);
        getCertPolicy(ext);
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return ;
    }
  }

  // 取密钥的使用

  public void getKeyUsage(X509Extensions ext)
  {
    DERObjectIdentifier derOid = new DERObjectIdentifier("2.5.29.15");
    X509Extension item = null;
    boolean isCritical;
    ASN1OctetString value;
    try {
        item=ext.getExtension(derOid);
        isCritical=item.isCritical();
        value=item.getValue();
    }
    catch (Exception ex) {
        return;
    }
    System.out.println(new String(Hex.encode(value.getOctets())));
  }
  // 取基本限制
  public void getBasicConstrains(X509Extensions ext)
  {
    byte[] bytes = getExtensionBytes("2.5.29.19",ext);

    if (bytes != null)
    {
        try
        {
          DERInputStream dIn = new DERInputStream(new ByteArrayInputStream(bytes));
          ASN1Sequence   seq = (ASN1Sequence)dIn.readObject();

          if (seq.size() == 2)
          {
            if (((DERBoolean)seq.getObjectAt(0)).isTrue())
            {
                int pathlen=((DERInteger)seq.getObjectAt(1)).getValue().intValue();
                System.out.println("是CA证书\t"+"max path len="+pathlen);
            }
            else
            {
                System.out.println("不是ca证书!");
            }
          }
          else if (seq.size() == 1)
          {
            if (seq.getObjectAt(0) instanceof DERBoolean)
            {
                if (((DERBoolean)seq.getObjectAt(0)).isTrue())
                {
                  System.out.println(Integer.MAX_VALUE);
                }
            }
          }
        }
        catch (Exception e)
        {
          throw new RuntimeException("error processing key usage extension");
        }
    }
  }
  // 取crl分布点
  public void getCRLPoint(X509Extensions ext)
  {
    byte[] byContent = getExtensionBytes("2.5.29.31",ext);

    if (byContent != null)
    {
        try
        {
          DERInputStream dIn = new DERInputStream(new ByteArrayInputStream(byContent));
          ASN1Sequence   seq = (ASN1Sequence)dIn.readObject();
          int dpCount=seq.size();
          for(int i=0;i<dpCount;i++)
          {
            // 第一个分布点(DistributionPoint)
            ASN1Sequence point1=(ASN1Sequence)seq.getObjectAt(i);
            DERObject tobj=(DERTaggedObject)point1.getObjectAt(0);
            System.out.println("CRL分布点"+(i+1)+":");
            while(tobj instanceof DERTaggedObject&&!((DERTaggedObject)tobj).isEmpty())
            {
                System.out.println("\ttagNo:"+((DERTaggedObject)tobj).getTagNo());
                if(tobj instanceof DERTaggedObject)
                  tobj=((DERTaggedObject)tobj).getObject();
            }
            DEROctetString os=(DEROctetString)tobj.getDERObject();
            String str=new String(os.getOctets());
            System.out.println("\t"+str);
          }
        }
        catch (Exception e)
        {
          System.out.println("crl分布点处理出错了!");
        }
    }
  }
  // 取证书策略
  public void getCertPolicy(X509Extensions ext)
  {
    byte[] byContent = getExtensionBytes("2.5.29.32",ext);

    if (byContent != null)
    {
        try
        {
          DERInputStream dIn = new DERInputStream(new ByteArrayInputStream(byContent));
          ASN1Sequence   seq = (ASN1Sequence)dIn.readObject();
          //String dump = DERDump.dumpAsString(seq);
          // 调试输出语句
          //System.out.println("证书策略:"+dump);
          for(int i=0;i<seq.size();i++)
          {
            getPolicyInfo((ASN1Sequence)seq.getObjectAt(i));
          }
        }
        catch(Exception e)
        {
          e.printStackTrace();
        }
    }
  }
  private void getPolicyInfo(ASN1Sequence seq)
  {
    if(seq.size()==2)
    {
        DERObjectIdentifier objID=(DERObjectIdentifier)seq.getObjectAt(0);
        System.out.println("证书策略标识:"+objID.getId());
        ASN1Sequence seqQualifier=(ASN1Sequence)seq.getObjectAt(1);
        for(int i=0;i<seqQualifier.size();i++)
          getPolicyQualifierInfo((ASN1Sequence)seqQualifier.getObjectAt(i));
    }
    else
        System.out.println("解析策略声明时出错!");
  }
  private void getPolicyQualifierInfo(ASN1Sequence seq)
  {
    if(seq.size()==2)
    {
        DERObjectIdentifier objID=(DERObjectIdentifier)seq.getObjectAt(0);
        System.out.println("策略声明标识:"+objID.getId());
        DERIA5String ia5=(DERIA5String)seq.getObjectAt(1);
        System.out.println("声明内容:"+ia5.getString());
    }
  }
  public static void main(String[] args) {
    CertManager cm = new CertManager();
    cm.getCert();
  }
}

 

上面代码使用了文件输入流来检查证书,适用于对单个证书文件的操作。如果想对证书库进行操作,就需要对代码作一下改动,以便能够读取keystore。

 

String storeFile = "c:\\default.keystore";
String storePass = "11111111";
String alias = "root";
DERInputStream dIn = null;
try{
  KeyStore ks = KeyStore.getInstance("jks");
  ks.load(new FileInputStream(storeFile), storePass.toCharArray());
  X509Certificate cert = (X509Certificate)ks.getCertificate(alias);
  dIn = new DERInputStream(new ByteArrayInputStream(cert.getEncoded()));
  ASN1Sequence seq = (ASN1Sequence)dIn.readObject();
  //重用代码
}catch(Exception e){
	e.printStackTrace();
}

 

 

分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    Java开源的xpath解析器Jsoupxpath.zip

    为了在java里也享受xpath的强大与方便但又苦于找不到一款足够强大的xpath解析器,故开发了JsoupXpath。JsoupXpath的实现逻辑清晰,扩展方便,支持几乎全部常用的xpath语法.http://www.cnblogs.com/ 为例 "//a/@href...

    Java语言基础下载

    第二十二章:使用Java解析XML 397 学习目标 397 解析器的介绍 398 DOM以及广义的基于树的处理具有几个优点 399 文档对象模型(DOM)解析实例 402 DOM对象 404 DOM解析的例子: 406 SAX解析实例 409 DOM4J解析实例 ...

    Java编程艺术 PDF

    本书各章内容分别涉及到Java精髓、递归下降的表达式解析器、用Java实现语言解释器、用Java创建下载管理器、用Java实现E-mail客户端和Internet搜索、用Java修饰HTML、显示统计图表、金融应用中的Applet和Servlet、...

    rome:用于RSS和Atom提要的Java库

    MediaRSS,GeoRSS等扩展的生成器和解析器。 rome-opml 解析器和工具。 rome-fetcher 已弃用(有关详细信息,请参见 ) 其他不推荐使用的模块: rome-certiorem , rome-certiorem-webapp和rome-propono 。 ...

    发帖源码java-snomed-scg-parser:一个开源Java库,用于解析以SNOMED合成语法编写的SNOMED后坐标表达式

    一个开放源码的Java库,用于解析用编写的SNOMED后坐标表达式。 ANTLR4语法 SCG的官方SNOMED International ABNF语法定义已转换为ANTLR4,以生成工具支持。 能力 验证后坐标表达式的语法 将有效的表达式转换为Java...

    lucene例子

    Lucene 是一个开源、高度可扩展的搜索引擎库,可以从 Apache Software Foundation ...允许用户使用定制排序、过滤和查询表达式解析扩展搜索行为。 使用基于文件的锁定机制保护并发索引修改。 允许同时搜索和编制索引。

    Lua解析器mLua.zip

    main()扩展mLua默认只能从文件系统中加载lua代码,但是如果对MLua的setBasedir方法进行重写,以其他的方式实现SourceLoader,则可以加载任意方式的lua代码,包括assets中的,和加密的。 标签:mLua

    java 编程艺术

    本书各章内容分别涉及到Java精髓、递归下降的表达式解析器、用Java实现语言解释器、用Java创建下载管理器、用Java实现E-mail客户端和Internet搜索、用Java修饰HTML、显示统计图表、金融应用中的Applet和Servlet、...

    Java EE常用框架.xmind

    Java EE常用框架 WebService 介绍 基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用 术语 XML. Extensible Markup Language -扩展性标记语言 WSDL – ...

    SeimiCrawler:一个简单,敏捷,分布式的支持SpringBoot的Java爬虫框架;一种敏捷的分布式爬虫框架

    同时融合了Java语言本身特点与Spring的特性,并希望在国内更方便且普遍的使用适当的效率更高的XPath解析HTML,所以SeimiCrawlerHTML解析器是 (独立扩展项目,非jsoup自带),并解析提取HTML数据工作均使用XPath来...

    注入资源:使用Java读取资源内容的简单便捷方法

    该库由 ,流畅的Java DSL以及 , 和的扩展组成,这些扩展允许使用简单的批注进行此操作。例子核心var text = resource() .onClassLoaderOf( this . getClass()) .withPath( " /com/adelean/junit/jupiter

    Struts2技术内幕:深入解析Struts架构设计与实现原理

    《Struts2技术内幕:深入解析Struts架构设计与实现原理》 ~ 陆舟 (作者)Struts 2 是Java Web 应用首选的MVC 框架。本书主要分为3个部分:准备篇讲述了源代码阅读环境、Struts的组织结构、MVC框架及Web开发话题相关的...

    java-servlet-api.doc

    RFC2049多用途Internet邮件扩展(多用途网际邮件扩充协议(MIME))第五部分:一致性标准和例子 RFC2068超文本传输协议--HTTP/1.1 RFC2069一个扩展HTTP:摘要访问鉴定 RFC2109HTTP状态管理机制 RFC2145HTTP版本号的使用和...

Global site tag (gtag.js) - Google Analytics