Selbstsignierte Zertifikate aus PEM Dateien in Java

Keine Kommentare

Selbstsignierte Zertifikate, die mit einer Zertifikaskette in einer PEM Datei liegen, können nicht direkt in einen Java Keystore (JKS) importiert werden. Um diese Zertifikate inklusive Herausgeberzertifikate mit dem SUN Keystore Provider nutzen zu können, müssen sie vorher mit openssl in einen PKCS12-Keystore importiert werden. Der PKCS12-Keystore kann dann mit Javas keytool in einen JKS-Keystore importiert werden.

JKS-Keystore mit privatem Schlüssel und Zertifikaskette

Mit

openssl pkcs12 -export -out keystore.p12 -inkey MyCertificate.pem -in MyCertificate.pem

wird der private Schlüssel und die vollständige Zertifikaskette in einen neuen PKCS12-Keystore „keystore.p12″ importiert. Es ist wichtig ein Export-Passwort anzugeben wenn opensll danach fragt, sonst kann keytool den privaten Schlüssel im nächsten Schritt nicht lesen. Jetzt kann der PKCS12-Keystore in einen JKS-Keystore importiert werden:

keytool -importkeystore -destkeystore keystore.jks -srcstoretype PKCS12 -srckeystore certificate.p12

Nach Angabe der Passwörter für den Ausgangs- und Ziel-Keystore werden das Client-Zertifikat und die vollständige Zertifikaskette in den JKS-Keystore „keystore.jks“ importiert. Der Standardalias für den Schlüssel ist „1“. Dieser kann mit der Kommandozeilenoption -destalias <your_alias_here> auch abweichend angegeben werden.

Ein

keytool -list -keystore keystore.jks

zeigt einen Eintrag als „PrivateKeyEntry“ der für Client-Zertifikate entscheidend ist. Mit der Option -v wird die vollständige Zertifikaskette ausgegeben, die aus dem privaten Schlüssel, den Zwischenzertifikaten und dem Root-Zertifikat besteht. Wird das Client-Zertifikat für SSL Verbindungen gebraucht, muss der neue Keystore noch konfiguriert werden:

System.setProperty("javax.net.ssl.keyStore", "path/to/keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
System.setProperty("javax.net.ssl.keyStoreType", "JKS");

Java kann zudem auch PKCS12-Keystores lesen. In diesem Fall muss für „javax.net.ssl.keyStoreType“ der Typ „PKCS12″ und als Keystore die Datei aus dem ersten Schritt angegeben werden.

JKS-Truststore mit öffentlichem Server-Zertifikat

Um das selbstsignierte Zertifikat, das von einer nicht öffentlichen CA (certificate authority) signiert wurde benutzen zu können, muss das öffentliche Server-Zertifikat noch in einen Truststore importiert werden. Die keystore.p12 Datei aus dem ersten Schritt ist ein guter Startpunkt, um nur die CA Zertifikate zu extrahieren:

openssl pkcs12 -in keystore.p12 -cacerts -nokeys -out chain.pem

exportiert die CA Zertifikate in die Datei „chain.pem“. Mit keytool können diese dann in einen neuen JKS-Truststore importiert werden:

keytool -importcert -trustcacerts -file chain.pem -keystore chain.jks

Anstatt „chain.jks“ kann als JKS-Truststore auch der vorher erstellte „keystore.jks“ angegeben werden. Dann liegen Client- und Server-Zertifikate im der selben Datei. Genau wie der Keystore muss der Truststore konfiguriert werden, damit er für SSL-Verbindungen ausgewertet wird:

System.setProperty("javax.net.ssl.trustStore", "path/to/truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");

Auch hier kann Java alternativ das PKCS12-Format verarbeiten. Dazu wird der SunJSSE Keystore Provider genutzt. Achtung: Der angegebene Truststore ist für die Anwendung bindend. Soll die Java-Anwendung zusätzlich auch SSL-Verbindungen zu Servern mit öffentlich signierten Zertifikaten aufbauen, müssen die CA-Zertifkate aus lib/security/cacerts auch in den eigenen Truststore übernommen werden.

Autor

Henning Treu

Share on FacebookGoogle+Share on LinkedInTweet about this on TwitterShare on RedditDigg thisShare on StumbleUpon

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *