java 提取证书指纹

正文


用到的依赖

<dependency>
  <groupId>org.bouncycastle</groupId>
  <artifactId>bcprov-jdk15on</artifactId>
  <version>1.70</version>
</dependency>

// 从字符串生成证书对象
// 证书必须以 "-----BEGIN CERTIFICATE-----" 开头,以 "-----END CERTIFICATE-----" 结尾。
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream in = new ByteArrayInputStream(cert.getBytes());
X509Certificate cert = (X509Certificate) cf.generateCertificate(in);

// 证书指纹 -1
// getEncoded 返回的是完整的证书编码,包括了证书的元数据和签名信息,适合用于将证书进行持久化存储或者在网络上传输
String certthumbprint1 = getThumbprint(cert.getEncoded(), "SHA-1");
// 证书指纹 -2
// getTBSCertificate 返回的是证书的原始信息,不包括数字签名,适合用于检查证书的内容和属性
String certthumbprint2 = getThumbprint(cert.getTBSCertificate(), "SHA-1");

// 公钥指纹
PublicKey publicKey = cert.getPublicKey();
String publickeythumbprint = getThumbprint(publicKey.getEncoded(), "SHA-1");

// 主体秘钥标识符 SubjectKeyIdentifier 
// 详细作用见:https://blog.csdn.net/a82514921/article/details/104589443/
// SubjectKeyIdentifier 在证书的扩展部分,需要使用下面的方法提取,subjectKeyIdentifierExt 直接取出来的还需要做一下处理
byte[] subjectKeyIdentifierExt = cert.getExtensionValue(Extension.subjectKeyIdentifier.getId());
// SN1OctetString 类的具体作用是对 OCTET STRING 类型数据进行封装和处理,提供了一系列方法来操作 OCTET STRING 数据,例如获取数据的字节数组、比较两个 OCTET STRING 是否相等等操作。
// 在证书处理和加密算法中,经常会涉及到对 ASN.1 编码的数据进行解析和处理,ASN1OctetString 类就提供了对 OCTET STRING 数据进行操作的便利接口。
// 更具体的作用还需要研究 ASN.1
ASN1OctetString octetString = ASN1OctetString.getInstance(subjectKeyIdentifierExt);
SubjectKeyIdentifier subjectKeyIdentifier = SubjectKeyIdentifier.getInstance(octetString.getOctets());
String dnQualifier = Base64.getEncoder().encodeToString(subjectKeyIdentifier.getKeyIdentifier());

// 获取Base64格式化的指纹
public static String getThumbprint(byte[] input, String algorithm) {
  try {
      List<String> algorithmList = Arrays.asList("SHA-1", "SHA-256", "MD5");
      if(StringUtils.isEmpty(algorithm)){
          // 默认 SHA-1
          algorithm = "SHA-1";
      }else{
          if(!algorithmList.contains(algorithm)){
              // 算法不支持
              return null;
          }
     }
     MessageDigest md = MessageDigest.getInstance("SHA-1");
     md.update(input);
     byte[] digest = md.digest();
     String thumbPrint = Base64.getEncoder().encodeToString(digest);
     return thumbPrint;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

参考


[1]. chatgpt3.5
[2]. openssl对SSL证书及密钥操作说明

posted @   BrianSun  阅读(205)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示