Хэш SHA-1 DER-кодировки сертификата - это то, что .NET получает с X509Certificate2.Thumbprint .
Как уже отмечалось, в примечаниях к MSDN :
Отпечаток пальца создается динамически с использованием алгоритма SHA1 и физически не существует в сертификате. Поскольку отпечаток является уникальным значением для сертификата, он обычно используется для поиска конкретного сертификата в хранилище сертификатов.
Стандартная библиотека Java не предоставляет отпечаток напрямую, но вы можете получить его следующим образом:
DatatypeConverter.printHexBinary(
MessageDigest.getInstance("SHA-1").digest(
cert.getEncoded())).toLowerCase();
Вот полный рабочий пример с использованием удобно доступного файла PEM:
Создать stackoverflow.crt.pem :
----- НАЧАТЬ СЕРТИФИКАТ -----
MIIHHjCCBgagAwIBAgIQDhG71w1UtxDQxvVAtrUspDANBgkqhkiG9w0BAQsFADBw
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS8wLQYDVQQDEyZEaWdpQ2VydCBTSEEyIEhpZ2ggQXNz
dXJhbmNlIFNlcnZlciBDQTAeFw0xNjA1MjEwMDAwMDBaFw0xOTA4MTQxMjAwMDBa
MGoxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJOWTERMA8GA1UEBxMITmV3IFlvcmsx
HTAbBgNVBAoTFFN0YWNrIEV4Y2hhbmdlLCBJbmMuMRwwGgYDVQQDDBMqLnN0YWNr
ZXhjaGFuZ2UuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr0YD
zscT5i6T2FaRsTGNCiLB8OtPXu8N9iAyuaROh / nS0kRRsN8wUMk1TmgZhPuYM6oF
S377V8W2LqhLBMrPXi7lnhvKt2DFWCyw38RrDbEsM5dzVGErmhux3F0QqcTI92zj
VW61DmE7NSQLiR4yonVpTpdAaO4jSPJxn8d + 4p1sIlU2JGSk8LZSWFqaROc7KtXt
lWP4HahNRZtdwvL5dIEGGNWx + 7B + XVAfY1ygc / UisldkA + a3D2 + 3WAtXgFZRZZ / 1
CWFjKWJNMAI6ZBAtlbgSNgRYxdcdleIhPLCzkzWysfltfiBmsmgz6VCoFR4KgJo8
Gd3MeTWojBthM10SLwIDAQABo4IDuDCCA7QwHwYDVR0jBBgwFoAUUWj / kK8CB3U8
zNllZGKiErhZcjswHQYDVR0OBBYEFFrBQmPCYhOznZSEqjIeF8tto4Z7MIIB6AYD
VR0RBIIB3zCCAduCEyouc3RhY2tleGNoYW5nZS5jb22CEXN0YWNrb3ZlcmZsb3cu
Y29tghMqLnN0YWNrb3ZlcmZsb3cuY29tgg1zdGFja2F1dGguY29tggtzc3RhdGlj
Lm5ldIINKi5zc3RhdGljLm5ldIIPc2VydmVyZmF1bHQuY29tghEqLnNlcnZlcmZh
dWx0LmNvbYINc3VwZXJ1c2VyLmNvbYIPKi5zdXBlcnVzZXIuY29tgg1zdGFja2Fw
cHMuY29tghRvcGVuaWQuc3RhY2thdXRoLmNvbYIRc3RhY2tleGNoYW5nZS5jb22C
GCoubWV0YS5zdGFja2V4Y2hhbmdlLmNvbYIWbWV0YS5zdGFja2V4Y2hhbmdlLmNv
bYIQbWF0aG92ZXJmbG93Lm5ldIISKi5tYXRob3ZlcmZsb3cubmV0gg1hc2t1YnVu
dHUuY29tgg8qLmFza3VidW50dS5jb22CEXN0YWNrc25pcHBldHMubmV0ghIqLmJs
b2dvdmVyZmxvdy5jb22CEGJsb2dvdmVyZmxvdy5jb22CGCoubWV0YS5zdGFja292
ZXJmbG93LmNvbYIVKi5zdGFja292ZXJmbG93LmVtYWlsghNzdGFja292ZXJmbG93
LmVtYWlsMA4GA1UdDwEB / wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB
BQUHAwIwdQYDVR0fBG4wbDA0oDKgMIYuaHR0cDovL2NybDMuZGlnaWNlcnQuY29t
L3NoYTItaGEtc2VydmVyLWc1LmNybDA0oDKgMIYuaHR0cDovL2NybDQuZGlnaWNl
cnQuY29tL3NoYTItaGEtc2VydmVyLWc1LmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
/ WwBATAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
MAgGBmeBDAECAjCBgwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzABhhhodHRwOi8v
b2NzcC5kaWdpY2VydC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly9jYWNlcnRzLmRp
Z2ljZXJ0LmNvbS9EaWdpQ2VydFNIQTJIaWdoQXNzdXJhbmNlU2VydmVyQ0EuY3J0
MAwGA1UdEwEB / wQCMAAwDQYJKoZIhvcNAQELBQADggEBAAzJAMGSdKoX1frdqNlN
iXu8Gcbsm / DxWMXpcTXlZn8s + / qQQoc + / 3o0CK3C8 / j9n5DmsYa88P6Ntt5ysDs +
b0ynXFva4CAEyKaoPM4SIpOjwfWBRSUOqAIkQO2 / LhKBwT / EnpaIHIKGnI0UdXLQ
oDfkMDg6mgJsEBsKdKF5EfEX7iU3NO5xVJPJE8 / R0btLAdYwxB9S6fSpCXGe2HqQ
D101O / 7 / 4MWNdFSbfdDSFcn5oEm + idimrqiNrF5knmuJy4qPBkL7thNuGK6rvYCF
ZJM03ZEZhkQmn2jG / 7LgjfwZmvfcITeADCpylf88bL + lf + vxe6cCl9CyqWgBDpsI
xpE =
----- КОНЕЦ СЕРТИФИКАТА -----
Создать X509.java :
import javax.xml.bind.DatatypeConverter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
public final class X509 {
public static void main (String [] args)
выбрасывает FileNotFoundException, CertificateException, NoSuchAlgorithmException {
FileInputStream = новый FileInputStream (args [0]);
CertificateFactory certificateFactory = CertificateFactory.getInstance ("X.509");
X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate (есть);
Строка thumbprint = getThumbprint (cert);
System.out.println (отпечаток);
}
частная статическая строка getThumbprint (сертификат X509Certificate)
выбрасывает NoSuchAlgorithmException, CertificateEncodingException {
MessageDigest md = MessageDigest.getInstance («SHA-1»);
byte [] der = cert.getEncoded ();
md.update (der);
байт [] дайджест = md.digest ();
String digestHex = DatatypeConverter.printHexBinary (дайджест);
return digestHex.toLowerCase ();
}
}
Скомпилируйте программу с Java 8:
javac X509.java
Или Java 9 - из-за модульного JDK / JPMS - DataTypeConverter не входит в java.base , но java.xml.bind , поэтому вам нужно чтобы явно зависеть от него во время сборки:
javac --add-modules java.xml.bind X509.java
В противном случае на Java 9 вы получите следующее при попытке его сборки:
X509.java:3: ошибка: пакет javax.xml.bind не отображается
import javax.xml.bind.DatatypeConverter;
^
(пакет javax.xml.bind объявлен в модуле java.xml.bind, которого нет в графе модуля)
1 ошибка
Запустите его с Java 8:
java X509 stackoverflow.crt.pem
В Java 9 - из-за модульной JDK / JPMS - DataTypeConverter не входит в java.base , но java.xml.bind , поэтому вам понадобится чтобы явно зависеть от него при запуске вашей программы:
java --add-modules java.xml.bind X509 stackoverflow.crt.pem
В противном случае на Java 9 вы получите следующее при попытке запустить:
Исключение в потоке "main" java.lang.NoClassDefFoundError: javax / xml / bind / DatatypeConverter
в X509.getThumbPrint (X509.java:29)
в X509.main (X509.java:19)
Вызвано: java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter
в java.base / jdk.internal.loader.BuiltinClassLoader.loadClass (BuiltinClassLoader.java:582)
в java.base / jdk.internal.loader.ClassLoaders $ AppClassLoader.loadClass (ClassLoaders.java:185)
в java.base / java.lang.ClassLoader.loadClass (ClassLoader.java:496)
... еще 2
Получите ожидаемый результат:
47adb03649a2eb18f63ffa29790818349a99cab7
Вы можете создать отпечаток с помощью команды openssl, например, если у вас есть сертификат в формате pem в файле (file.txt)
затем:
cat file.txt | openssl x509 -sha1 -fingerprint
- это создаст тот же отпечаток
Вот способ попроще:
using System.Security.Cryptography.X509Certificates;
X509Certificate2 xcert = new X509Certificate2("C:\some_cert.cerpub");
string certSubject = xcert.Subject;
string certThumbprint = xcert.Thumbprint;