2017-06-07 4 views
0

Mein SetupValidierung einer Zertifikatskette, wenn eine SSLSocket in Java

Mein Ziel ist es, eine Öffnung SSL einzurichten/TLS gesicherte Verbindung (explizit) mit einem FTP-Server. Das entsprechende Root-CA-Zertifikat wird in einem Truststore mit der Bezeichnung truststore.jks gespeichert. Nach dem AUTH TLS Befehl verwende ich den folgenden Code, um den SSLSocket aufzubauen.

public SSLSocket enterSecureMode(Socket s) throws Exception { 
     KeyStore truststore = KeyStore.getInstance("JKS"); 
     truststore.load(Files.newInputStream(Paths.get("truststore.jks")), "mypass".toCharArray()); 

     TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
     tmf.init(truststore); 

     SSLContext sCon = SSLContext.getInstance("TLS"); 
     sCon.init(null, tmf.getTrustManagers(), null); 

     SSLSocketFactory sslSocketFactory = sCon.getSocketFactory(); 
     return (SSLSocket) sslSocketFactory.createSocket(s, "<HOSTNAME>", 21, true); 
} 

Der Code selbst gut läuft und ich erhielt eine gesicherte Steckdosen-Verbindung, aber ich frage mich, ob diese Angriffe wie beispiels MITM oder nicht ausstehen kann. Ich meine, würde dieses Programm einen Versuch von jemandem entdecken, der versucht, mir ein gefälschtes Zertifikat zu geben. Daher würde ich mich sehr freuen, wenn mir einige erfahrenere SSL-Netzwerk-Programmierer dabei helfen könnten: D

Antwort

1

Das ist ausreichend. Der Angreifer müsste ein Zertifikat bereitstellen, das von der Stammzertifizierungsstelle signiert wurde. Allerdings brauchen Sie nicht alle diesen Code ein: Sie

System.setProperty("javax.net.ssl.trustStore", "truststore.jks"); 
SSLContext sCon = SSLContext.getDefault(); 
SSLSocketFactory sslSocketFactory = sCon.getSocketFactory(); 
return (SSLSocket) sslSocketFactory.createSocket(s, "<HOSTNAME>", 21, true) 

benötigen Wenn Sie völlig paranoid sein wollen, nach dem Erstellen der SSLSocket Sie können die SSLSession bekommen und dann die Peer-Zertifikatskette und stellen Sie sicher, dass die nullte Eintrag stimmt genau mit dem genauen Zertifikat des Servers überein, aber dieser Schritt wird größtenteils weggelassen.

+0

Nehmen wir an, ich bin paranoid in Bezug auf Sicherheit (vor allem, weil ich den maximalen Schutz für meine Programme/Daten möchte). Müsste ich vielleicht den Fingerabdruck des Servers-Zertifikats speichern und überprüfen, ob sie beim Starten einer SSL-Verbindung übereinstimmen oder nicht? – MiEbe

+0

Ja, Sie könnten das tun, oder tatsächlich das gesamte Zertifikat speichern und bitweise vergleichen. Aber wenn Sie eines dieser Dinge getan haben, müssten Sie es bei jedem Ablauf aktualisieren. Vorausgesetzt, es ist von der richtigen Stammzertifizierungsstelle signiert und hat denselben Subject Distinguished Name, den die Stammzertifizierungsstelle überprüfen muss, kann sie als vertrauenswürdig eingestuft werden. – EJP

Verwandte Themen