2009-04-06 9 views
10

See related question.Wie verwende ich PEM-Datei, um einen SSL-Socket in Java zu erstellen?

Ich habe eine PEM-Datei mich zur Verfügung gestellt und mir wurde gesagt, dass es bei der Errichtung einen SSL-Socket benötigt werden, die für einige API-Aufrufe zu einem C++ Server verbindet. Weiß jemand wie ich die PEM-Datei einlesen und verbinden kann? Mir wurde auch das Paraphärpasswort gegeben.

+0

Duplizieren; Ich denke, die andere Version der Frage ist informativer. – erickson

Antwort

9

Es klingt, als wäre die PEM-Datei ein Client-Zertifikat, mit dem Sie sich beim Server anmelden können. Wenn es das Client-Zertifikat ist, und es klingt wie es ist, werden Sie wahrscheinlich eine CA-Zertifikat-Datei auch für die Validierung des Server-Zertifikats benötigen, um eine Verbindung herzustellen.

Die CA-Zertifikate müssen in einen Truststore und Ihre Client-Zertifikate müssen in einen Keystore gehen. In Java sind dies beide JKS (obwohl PKCS12 nur eingeschränkt unterstützt wird). Es gibt Standardspeicherorte für Keystore/Truststore für die JRE sowie für jeden Benutzer. Sie können auch externe Speicherorte für diese Dateien in Ihrem Code angeben, wie in den folgenden Beispielen. Die commons-ssl-Bibliothek scheint in der Lage zu sein, PEM direkt zu unterstützen, ohne JKS zu benötigen, aber ich habe es nicht benutzt.

Die Standard-Passphrase für diese Keystores in Java ist "changeit" ohne die Anführungszeichen.

This page zeigt, dass Sie die PEM in Ihren Keystore/Truststore lesen müssen. Hier ist another example.

Sobald Sie Ihre Trusts und Schlüsselspeicher richtig eingerichtet ist, müssen Sie die folgende JSSE system properties auf Ihre JVM weitergeben müssen:

javax.net.ssl.keyStore 
javax.net.ssl.keyStoreType 
javax.net.ssl.keyStorePassword 
javax.net.ssl.trustStore 
javax.net.ssl.trustStoreType 
javax.net.ssl.trustStorePassword 

Sie können sie als -D Parameter an die JRE oder, wie in den Beispielen angeben unten, programmatisch.

Sobald Sie das abgeschlossen haben, ist ein commons-ssl example Erstellen eines Sockets. Auch, Heres die Java API für SSLSocket. Heres auch eine example, die keine Apache Commons verwendet.

+1

Ahhm .. nette Antwort - aber er fragte tatsächlich nach C++, nicht nach Java. – Guss

+4

Eigentlich hat er Java und JKS getaggt, was der Java KeyStore ist. Er möchte eine Verbindung zu einem Remote-Server herstellen, der über einen SSL-Socket erfolgt. Die Tatsache, dass die andere Seite C++ für den Verbindungsmechanismus nicht so relevant ist. –

0

Sie benötigen eine Bibliothek, die SSL verarbeitet. Wie John Ellinwood bemerkte, bieten einige Frameworks (z. B. Java 2 SE) diese integrierten Funktionen, für andere müssen Sie Bibliotheken von Drittanbietern verwenden.

C Entwickler verwenden oft openssl direkt, aber es kann nicht gesagt werden, dass es einfach zu handhaben ist und wenn man C++ benutzt, gibt es mehrere "gotchas", in die man leicht hineinfällt.

Ich empfehle, dass Sie eine C++ - Netzwerkbibliothek mit Unterstützung für SSL verwenden, z. B. die Netzwerkbibliothek von QT oder Poco NetSSL. Ein paar Tutorial-Dokumentationen finden Sie unter hereand here für die API-Dokumentation - Sie möchten wahrscheinlich einen Blick auf initializeClient werfen, die eine PEM-Datei direkt nimmt.