1. 概述
证书的指纹(或指纹标识)是其唯一的身份标识符。它并非证书的一部分,而是根据证书计算得出的。
在这篇简短教程中,我们将学习如何在Java中计算X509证书的指纹。
2. 使用纯Java
首先,从我们的证书文件中获取一个X509Certificate对象:
public static X509Certificate getCertObject(String filePath)
throws IOException, CertificateException {
try (FileInputStream is = new FileInputStream(filePath)) {
CertificateFactory certificateFactory = CertificateFactory
.getInstance("X.509");
return (X509Certificate) certificateFactory.generateCertificate(is);
}
}
接下来,从这个对象中获取指纹:
private static String getThumbprint(X509Certificate cert)
throws NoSuchAlgorithmException, CertificateEncodingException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(cert.getEncoded());
return DatatypeConverter.printHexBinary(md.digest()).toLowerCase();
}
例如,如果我们有一个名为baeldung.pem的X509证书文件,我们可以使用上述方法轻松打印其指纹:
X509Certificate certObject = getCertObject("baeldung.pem");
System.out.println(getThumbprint(certObject));
结果看起来像这样:
c9fa9f008655c8401ad27e213b985804854d928c
3. 使用Apache Commons Codec
我们还可以利用Apache Commons Codec库中的DigestUtils类来达到相同的目标。
在我们的pom.xml文件中添加依赖:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
现在,我们只需使用sha1Hex()方法从X509Certificate对象中获取指纹:
DigestUtils.sha1Hex(certObject.getEncoded());
4. 总结
在这篇快速教程中,我们了解了两种在Java中计算X509证书指纹的方法。
如往常一样,本文的示例代码可以在GitHub上找到。