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. ApacheCommonsCodecを使用する

Apache CommonsCodecライブラリの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証明書の指紋を計算する2つの方法を学びました。

いつものように、この記事のサンプルコードは、GitHubにあります。