Перейти к основному содержимому

Вычисление отпечатка сертификата X509 в Java

· 2 мин. чтения

1. Обзор

Отпечаток сертификата (или отпечаток пальца) — это уникальный идентификатор сертификата . Он не является частью сертификата, но рассчитывается на его основе.

В этом кратком руководстве мы увидим, как вычислить отпечаток сертификата X509 в Java .

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();
}

Например, если у нас есть файл сертификата X509 с именем foreach.pem , мы можем использовать описанные выше методы, чтобы легко напечатать его отпечаток:

X509Certificate certObject = getCertObject("foreach.pem");
System.out.println(getThumbprint(certObject));

Результат будет выглядеть примерно так:

c9fa9f008655c8401ad27e213b985804854d928c

3. Используйте кодек Apache Commons

Мы также можем использовать класс DigestUtils из библиотеки кодеков Apache Commons для достижения той же цели.

Давайте добавим зависимость в наш файл pom.xml :

<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>

Теперь мы просто используем метод sha1Hex() , чтобы получить отпечаток из нашего объекта X509Certificate :

DigestUtils.sha1Hex(certObject.getEncoded());

4. Вывод

В этом кратком руководстве мы узнали о двух способах вычисления отпечатка сертификата X509 в Java .

Как всегда, пример кода из этой статьи можно найти на GitHub .