Как получить/вычислить след большого пальца сертификата X509 в Java?

  1. необходимо генерировать схему и имя таблицы от Derby системный каталог DB.
  2. Порядок все таблицы отношением.
  3. Генерируют оператор Java для отбрасывания все таблицы
  4. автоматическая фиксация Использования () метод и устанавливают этот метод на ложь. для ручной фиксации или транзакций отката, когда получил ошибки.
  5. Выполнение Вы процесс Java. Удачи.
38
задан ataylor 1 August 2012 в 19:40
поделиться

3 ответа

Хэш SHA-1 DER-кодировки сертификата - это то, что .NET получает с X509Certificate2.Thumbprint .

Как уже отмечалось, в примечаниях к MSDN :

Отпечаток пальца создается динамически с использованием алгоритма SHA1 и физически не существует в сертификате. Поскольку отпечаток является уникальным значением для сертификата, он обычно используется для поиска конкретного сертификата в хранилище сертификатов.

Стандартная библиотека Java не предоставляет отпечаток напрямую, но вы можете получить его следующим образом:

DatatypeConverter.printHexBinary(
        MessageDigest.getInstance("SHA-1").digest(
                cert.getEncoded())).toLowerCase();

Вот полный рабочий пример с использованием удобно доступного файла PEM:

  1. Создать 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 =
    ----- КОНЕЦ СЕРТИФИКАТА -----
    
  2. Создать 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 ();
     }
    }
    
  3. Скомпилируйте программу с 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 ошибка
    
  4. Запустите его с 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
    
  5. Получите ожидаемый результат:

     47adb03649a2eb18f63ffa29790818349a99cab7
    
71
ответ дан 27 November 2019 в 03:10
поделиться

Вы можете создать отпечаток с помощью команды openssl, например, если у вас есть сертификат в формате pem в файле (file.txt)

затем:

cat file.txt | openssl x509 -sha1 -fingerprint - это создаст тот же отпечаток

3
ответ дан 27 November 2019 в 03:10
поделиться

Вот способ попроще:

using System.Security.Cryptography.X509Certificates;    

X509Certificate2 xcert = new X509Certificate2("C:\some_cert.cerpub");
string certSubject = xcert.Subject;
string certThumbprint =  xcert.Thumbprint;   
-9
ответ дан 27 November 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: