2012-06-21 6 views
11

Say I zwei Java-Anwendungen, die ich schrieb: Ping.jar und Pong.jar und sie bekommen im Einsatz und lief auf zwei separaten Servern (Ping.jar setzt auf srv-01.myorg.com und Pong.jar setzt auf srv-02.myorg.com), und diese beiden Anwendungen müssen kommunizieren miteinander (2-Wege) über SSL. Nehmen wir auch an, dass jede App ihr eigenes SSL-Zertifikat hat.SSL-Zertifikatprüfung in Java

  • Wie kann ich, ein Java-Programmierer, Code Ping und Pong zu jedem SSL-Zertifikat des anderen zu überprüfen? Bietet jede CA eine Art RESTful-API, die ich beispielsweise mit HttpClient erreichen kann? Verfügt Java über eine eigene API zur Überprüfung von Zertifikaten? Gibt es Open-Source-JARs oder -Dienste von Drittanbietern, die ich verwenden kann?

Ich war überrascht, wie wenig aufgetaucht, wenn ich online suchte.

+0

Welche Webserver verwenden Sie? Bei der Aktivierung von SSL (in Ihrem Fall mutual-ssl) handelt es sich normalerweise um eine Serverkonfiguration, nicht um eine Codierung. – npe

+0

Nun, lassen Sie uns beide Szenarien sagen: (1) eine reine Java-App mit rohen Sockets/NIO (wie mein Anwendungsfall oben impliziert), und (2) Oracle GlassFish. Ich bin jetzt wirklich an beiden Anwendungsfällen interessiert. – IAmYourFaja

+0

Anzeige 1. Nie versucht, das könnte eine höllische Aufgabe sein, bei Null zu beginnen. Ad 2. Schauen Sie sich [diesen Link] (http://glassfish.java.net/javaee5/security/faq.html) an, insbesondere zwei Fragen zur SSL- und Client-Zertifikat-Authentifizierung. Es gibt noch viel mehr zu tun, also lesen Sie Glassfish über Sicherheit, aber wie gesagt, es geht nur um Konfiguration, nicht um Kodierung. – npe

Antwort

21

Wenn Sie eine Verbindung mit den Java SE SSL/TLS-Klassen herstellen (z. B. SSLSocket oder SSLEngine), verwenden Sie die Java Secure Socket Extension (JSSE).

Es wird das Zertifikat der Gegenstelle gemäß der SSLContext, die zum Erstellen dieser SSLSocket oder SSLEngine verwendet wurde, überprüfen.

Diese SSLContext wird mit TrustManager initialisiert, die vorschreiben, wie Vertrauen aufgebaut werden soll.

Sofern Sie keine spezielle Konfiguration benötigen, können Sie sich oft auf the default values verlassen: Dies basiert auf dem PKIX-Algorithmus (RFC 3280), um das Zertifikat gegen eine Reihe von Trust-Ankern zu überprüfen (standardmäßig cacerts). cacerts, im Lieferumfang von Oracle JRE ist ein JKS-Keystore, dem Sie zusätzliche Zertifikate hinzufügen können. Sie können Zertifikate z. B. explizit mit keytool hinzufügen.

Sie können auch eine X509TrustManager basierend auf einem benutzerdefinierten Schlüsselspeicher programmatisch (wie in this answer beschrieben) und verwenden Sie es in einem bestimmten SSLContext erstellen, die nicht den Standard ein nicht beeinträchtigt.

Wenn Sie Ihr eigenes Protokoll verwenden, müssen Sie außerdem überprüfen, ob das Zertifikat, das Sie erhalten haben, mit dem Hostnamen übereinstimmt, den Sie gesucht haben (siehe RFC 6125). In der Regel können Sie nach dem alternativen Namen des Betreffs in der X509Certificate suchen, die Sie erhalten (erhalten Sie das erste Peer-Zertifikat in der Kette von SSLSession). Wenn dies nicht gelingt, suchen Sie nach dem CN RDN im Subject Distinguished Name.

+1

Sie könnten auch interessiert sein an [this] (http://stackoverflow.com/a/6341566/372643). – Bruno

0

Sie müssen nicht gegenseitig die Zertifikate gegenseitig überprüfen.

Sie müssen nur jedes Serverzertifikat in die anderen Cacerts importieren, auf diese Weise vertrauen sich beide Anwendungsserver automatisch gegenseitig.

+0

Was ist, wenn beide Endpunkte liegen? Ich habe dieses Ping/Pong-Beispiel angegeben, um das Konzept zu veranschaulichen, wie versucht wird, ein Cert in reinem Java zu verifizieren. Die Tatsache, dass ich Ping/Pong geschrieben habe, sollte nicht implizieren, dass sie sich gegenseitig vertrauen können! Abstrakt denken: Wenn Ping und Pong von verschiedenen Entwicklungsgeschäften geschrieben und in zwei völlig getrennten Netzwerken gehostet würden, was würden sie tun müssen, um sich gegenseitig zu verifizieren? – IAmYourFaja

+0

Ja, das tust du. SSL bietet Datenschutz, Integrität und Authentifizierung der Peer-Identität. Ob diese Peer-Identität die von der Anwendung erwartete Identität ist und was diese Identität in der Anwendung tun darf, sollte von der Anwendung bei Bedarf überprüft werden. Dies ist der Schritt "Autorisierung", und SSL kann dies nicht für Sie tun. – EJP

1

Sie können das Peer-Zertifikat erhalten entweder durch ein HandshakeCompletedListener zum SSLSocket Anbringen und das Zertifikat von der Veranstaltung bekommen, oder auch durch die SSLSession vom SSLSocket bekommen und das Peer-Zertifikat von der Sitzung zu bekommen.

SSL bietet Datenschutz, Integrität und Authentifizierung der Peer-Identität. Ob diese Peer-Identität die von der Anwendung erwartete Identität ist und was diese Identität in der Anwendung tun darf, sollte von der Anwendung bei Bedarf überprüft werden. Dies ist der Schritt "Autorisierung", und SSL kann dies nicht für Sie tun.