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证书及密钥操作说明
分类:
Linux以及服务器开发
, spring-boot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App