2016-08-26 2 views
0

Ich verwende pyOpenSSL, um ein X509-Zertifikat zu erstellen. Ich muss dieses Zertifikat in einen Java JKS-Keystore importieren, um es für meine Java-Anwendung verfügbar zu machen. Das funktioniert gut, solange ich keine subjectAltName Erweiterung zum Zertifikat hinzufüge. Wenn das Zertifikat ein alternatives Thema gesetzt hat, den Import in den JKS Schlüsselspeicher fehlschlägt:Importieren X509-Zertifikat mit SubjectAltName (SAN) in JKS Keystore

[email protected]:~# /opt/oracle/java/jdk64-1.8.0_92/bin/keytool -keystore keystore -storepass changeit -noprompt -importcert -alias example -file certificate.crt -v 
keytool error: java.lang.Exception: Input not an X.509 certificate 
java.lang.Exception: Input not an X.509 certificate 
    at sun.security.tools.keytool.Main.doCommands(Main.java:1009)655) 
    at sun.security.tools.keytool.Main.main(Main.java:336) 
[email protected]:~# 

Wenn ich dieses Zertifikat drucke mit OpenSSL auf der Kommandozeile, ich diese Ausgabe erhalten:

[email protected]:~# openssl x509 -in certificate.crt -text -noout 
Certificate: 
    Data: 
     Version: 1 (0x0) 
     Serial Number: 0 (0x0) 
    Signature Algorithm: sha256WithRSAEncryption 
     Issuer: OU=example.com, CN=my-server.example.com, O=example.com 
     Validity 
      Not Before: Aug 26 12:03:03 2016 GMT 
      Not After : Aug 25 12:03:03 2021 GMT 
     Subject: OU=example.com, CN=my-server.example.com, O=example.com 
     Subject Public Key Info: 
      Public Key Algorithm: rsaEncryption 
       Public-Key: (2048 bit) 
       Modulus: 
        00:cc:a7:53:5a:38:...:11:2f 
       Exponent: 65537 (0x10001) 
     X509v3 extensions: 
      X509v3 Subject Alternative Name: 
       DNS:localhost 
    Signature Algorithm: sha256WithRSAEncryption 
     ab:51:12:fb:a6:a6:...:0d:4b 

Das ist das ist Zertifikat ist offensichtlich gültig. Und gemäß oracle's documentation sollte das Java 8 keytool die Erweiterung SubjectAlternativeName unterstützen.

Als ich versuchte, alles mit keytool selbst zu erzeugen - das scheint zu funktionieren - ich bemerkte, dass das von keytool generierte Zertifikat eine zweite Verlängerung X509v3 Subject Key Identifier hat:

Certificate: 
    Data: 
     Version: 3 (0x2) 
     Serial Number: 1510484556 (0x5a082a4c) 
    Signature Algorithm: sha256WithRSAEncryption 
     Issuer: O=example.com, OU=example.com, CN=my-server.example.com 
     Validity 
      Not Before: Aug 26 12:52:43 2016 GMT 
      Not After : Nov 24 12:52:43 2016 GMT 
     Subject: O=example.com, OU=example.com, CN=my-server.example.com 
     Subject Public Key Info: 
      Public Key Algorithm: rsaEncryption 
       Public-Key: (2048 bit) 
       Modulus: 
        00:99:b6:b1:11:a6:...:7b:39 
       Exponent: 65537 (0x10001) 
     X509v3 extensions: 
      X509v3 Subject Alternative Name: 
       DNS:localhost 
      X509v3 Subject Key Identifier: 
       66:75:AD:7A:A5:19:AB:43:DE:55:E4:A7:4F:C2:3D:53:55:49:CE:48 
    Signature Algorithm: sha256WithRSAEncryption 
     50:7c:fe:c8:5d:1b:...:da:27 

Muß ich hinzufügen müssen, um diese Erweiterung zu meinem Zertifikat mit pyOpenSSL auch. Aber was wäre der richtige Wert ?!

Antwort

1

Nun, nachdem ich alles für diese Frage aufgeschrieben habe, ist mir aufgefallen, dass es einen zweiten Unterschied zwischen dem mit pyOpenSSL generierten Zertifikat und dem keytool gibt. Das Keytool-Zertifikat gibt Version: 3 (0x2) während der andere Version: 1 (0x0) sagt.

Ich bin nicht zu sehr in die X509-Spezifikationen, aber da die Erweiterungen alle X509v3 vorangestellt sind, würde ich vermuten, dass die Erweiterung Unterstützung für Zertifikate der Version 1 nicht verfügbar ist.

Und nach meinem Python-Code Anpassung der Version 3 zu setzen (eigentlich 2 als Version 0 basierend ist), den Import in keytool wie erwartet funktioniert:

_req = OpenSSL.crypto.X509Req() 
_req.set_version(2) 
... 
Verwandte Themen