//

Selbstsignierte Zertifikate aus PEM Dateien in Java

28.1.2013 | 2 Minuten Lesezeit

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

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

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:

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

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 auch abweichend angegeben werden.

Ein

1keytool -list -keystore keystore.jks
2

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:

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

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:

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

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

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

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:

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

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.

Beitrag teilen

Gefällt mir

0

//

Gemeinsam bessere Projekte umsetzen

Wir helfen Deinem Unternehmen

Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.

Hilf uns, noch besser zu werden.

Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.