BC包解析SSL证书

一、SSL证书解析两种方式

1,JDK自带的java.security解析证书
2,需要引入BouncyCastle依赖,即BC包
但是需要注意的是,JDK自带的解析工具类不能解析国密证书,但是BC包是支持国密算法的。当遇到下面的错误时,就表示JDK自带解析工具不能解析证书,需替换为BC包来解析

java.security.cert.CertificateParsingException: java.io.IOException: Unknown named curve: 1.2.156.10197.1.301

二、引入BC包依赖,实现证书解析逻辑

1,引入BC包依赖

 <!-- bc库解析证书信息 -->
 <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-jdk15on</artifactId>
      <version>1.64</version>
 </dependency>

2,读取SSL证书

InputStream fileIn =  null;
try {
    fileIn = new FileInputStream("F:\\baidu.cer"); // 将本地证书读入文件流

    // 引入BC库
    Security.addProvider(new BouncyCastleProvider());
    CertificateFactory cf = CertificateFactory.getInstance("X.509","BC");
    Certificate cert = cf.generateCertificate(fileIn);  // 将文件流的证书转化为证书类

    X509Certificate x509Cert = (X509Certificate)cert;

} catch (Exception e) {
    logger.error("证书转换及解析异常:",e.getMessage());
} finally {
    try {
       if (fileIn != null) {
           fileIn.close();
       }
    } catch (IOException e) {
      logger.error("关闭证书文件输入流异常:",e.getMessage());
    }
}

3,解析SSL证书基本信息

    // 解析证书基本信息
    private static void parseCertInfo(X509Certificate x509Cert) {
        // 证书公钥信息,转为base64字符串
        PublicKey publicKey = x509Cert.getPublicKey();
        String base64PublicKey = new String(Base64.encodeBase64Chunked(publicKey.getEncoded()));

        logger.info("证书版本号 ",x509Cert.getVersion());
        logger.info("证书序列号 ",x509Cert.getSerialNumber().toString());
        logger.info("证书使用者信息 ",x509Cert.getSubjectDN());
        logger.info("证书颁发者信息 ",x509Cert.getIssuerDN());
        logger.info("证书有效期-开始时间 ",x509Cert.getNotBefore());
        logger.info("证书有效期-结束时间 ",x509Cert.getNotAfter());
        logger.info("证书签名算法 ",x509Cert.getSigAlgName());
        logger.info("证书加密算法 ",publicKey.getAlgorithm());// 加密算法
        logger.info("证书公钥信息",base64PublicKey);// Base64,包含公钥算法和公钥值
    }
 // 获取域名列表
    private static void getDnsList(X509Certificate x509Cert) {
        try {
            if (x509Cert.getSubjectAlternativeNames() != null) {
                Iterator<List<?>> iterator = x509Cert.getSubjectAlternativeNames().iterator();

                while (iterator.hasNext()) {
                    List<?> item = iterator.next();

                    String domain = (String) item.get(item.size()-1);
                    logger.info("证书的DNS域名列表为 : " + domain);
                }
            }


        } catch (CertificateParsingException e) {
            logger.error("解析证书的域名列表报错:",e.getMessage());
        }
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注:下文中的 *** 代表文件名中的版本号。 # 【bcprov-jdk15on-***.jar中文文档.zip】 中含: 中文文档:【bcprov-jdk15on-***-javadoc-API文档-中文(简体)版.zip】 jar下载地址:【bcprov-jdk15on-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【bcprov-jdk15on-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【bcprov-jdk15on-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【bcprov-jdk15on-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: bcprov-jdk15on-***.jar中文文档.zip,java,bcprov-jdk15on-***.jar,org.bouncycastle,bcprov-jdk15on,***,jar,Maven,第三方jar,组件,开源组件,第三方组件,Gradle,bouncycastle,bcprov,jdk15on,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【bcprov-jdk15on-***.jar中文文档.zip】,再解压其中的 【bcprov-jdk15on-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '***' Gradle (Short): implementation 'org.bouncycastle:bcprov-jdk15on:***' Gradle (Kotlin): implementation("org.bouncycastle:bcprov-jdk15on:***") ``` # 含有的 Java package()(此处仅列举3个): ``` org.bouncycastle org.bouncycastle.asn1 org.bouncycastle.asn1.anssi ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` org.bouncycastle.LICENSE org.bouncycastle.asn1.ASN1ApplicationSpecific org.bouncycastle.asn1.ASN1ApplicationSpecificParser ...... ```
### 回答1: bc(Bouncy Castle)库是一个Java平台上的开源密码学库,提供了丰富的密码学算法和协议的实现。其中括了ASN.1(Abstract Syntax Notation One)编解码的实现。 ASN.1是一种用于描述数据结构的标准格式,通常用于在网络传输中编码和解码数据。在使用bc解析ASN.1格式数据时,需要使用bc库中的ASN1InputStream和ASN1OutputStream类。 ASN1InputStream用于将ASN.1编码的数据解码为Java对象,而ASN1OutputStream则用于将Java对象编码为ASN.1格式的数据。例如,对于一个ASN.1编码的证书文件,可以使用如下代码解析: ``` Security.addProvider(new BouncyCastleProvider()); FileInputStream fis = new FileInputStream("certificate.der"); ASN1InputStream asnInputStream = new ASN1InputStream(fis); ASN1Sequence sequence = (ASN1Sequence) asnInputStream.readObject(); X509CertificateHolder certificateHolder = new X509CertificateHolder(sequence); asnInputStream.close(); ``` 其中,BouncyCastleProvider是bc库的提供者,ASN1InputStream用于解析ASN.1格式的数据,ASN1Sequence代表ASN.1中的Sequence类型数据,X509CertificateHolder是X.509证书的持有者,用于表示证书信息。 需要注意的是,ASN.1格式数据的解析需要按照ASN.1规范进行,否则可能会解析失败。 ### 回答2: bc库是一个开源的密码学库,它提供了一系列的功能和工具,解析和处理asn1编码的能力。 ASN.1(Abstract Syntax Notation One)是一种用于描述数据结构的标记语言。它是一种独立于机器和编程语言的标准,用于在不同系统之间传输和存储数据。ASN.1的定义通常用于描述传输协议、密钥交换、身份验证和证书等领域。 bc库提供了ASN.1编码的解析功能,可以将ASN.1编码的数据转化为可读的结构化数据,以便于程序的处理和分析。它支持多种ASN.1的标准,如X.509证书、PKCS#7、PKCS#10等。 解析ASN.1编码使用bc库时,首先需要将ASN.1编码的数据加载到程序中。然后使用bc库提供的解析函数对数据进行解析解析函数会将数据转换为相应的ASN.1结构,并提供对结构中字段的访问和操作。用户可以根据自己的需要,选择解析特定的ASN.1数据类型或者字段。 使用bc解析ASN.1编码可以帮助开发者更方便地处理和分析ASN.1相关的数据。它提供了一种标准化的方法来解析和处理ASN.1编码,避免了手动解析和处理编码的复杂性。同时,bc库还提供了其他密码学功能,如加密、解密、签名和验证等,便于开发者在安全通信和数据传输中使用ASN.1编码。 ### 回答3: bc库是一个Java加密算法库,它提供了广泛的加密和解密功能。它也含了一些与ASN.1(抽象语法标记集合)相关的功能,它可以帮助我们解析和处理ASN.1编码的数据。 ASN.1是一种用于描述和编码数据结构的标准,它定义了数据结构、编码规则和解码规则。ASN.1编码是一种二进制格式的数据表示方式,它被广泛应用于网络协议、安全协议和通信协议中。 在bc库中,我们可以使用ASN1InputStream类来解析ASN.1编码的数据。首先,我们需要创建一个ASN1InputStream对象,并将ASN.1编码的数据传递给它。然后,我们可以使用readObject方法从输入流中读取ASN.1编码的数据,并将其转换为相应的ASN.1对象。 bc库还提供了一些常用的ASN.1对象,例如ASN1Sequence和ASN1Integer。ASN1Sequence对象表示一个序列,它由一组按顺序排列的ASN.1对象组成。ASN1Integer对象表示一个整数。 使用bc解析ASN.1编码的数据可以帮助我们理解和处理复杂的数据结构。例如,我们可以解析X.509证书,以获取证书含的信息。我们还可以解析PKCS#7格式的数据,以验证数字签名或提取加密的数据。 总之,bc库提供了强大的功能来解析和处理ASN.1编码的数据。通过使用bc库,我们可以方便地解析和操作ASN.1编码的数据,从而为我们的应用程序提供更多的功能和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值