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上找到。