2016-02-12 16 views
6

Die Oracle-Dokumentation scheint anzuzeigen, dass Java 8 SNI automatisch und standardmäßig sendet. Wireshark weist auf etwas anderes hin. Ich bin ein PowerShell-Systemadministrator, kein Java-Entwickler, daher ist es nahezu sicher, dass ich etwas übersehen habe.In Java 8 kann HttpsURLConnection gesendet werden, um Servernamenangabe (SNI) zu senden

Bei Verwendung mit dem richtigen Trust-Keystore gibt der folgende Code den Status 200 von allen SSL-Websites zurück, für die kein SNI erforderlich ist. Es kommt auch gut zurück, wenn eine Verbindung zur SSL-Standardwebsite eines Apache-Servers mit mehreren Hosts hergestellt wird. Wenn Sie aufgefordert werden, eine Verbindung zu einer nicht standardmäßigen Site herzustellen, schlägt der Cert-Name jedoch nicht mit dem Site-Namen überein, da er eine Verbindung zur Standardwebsite herstellt.

import java.util.*; 
import java.net.*; 
import javax.net.ssl.*; 
import java.io.*; 

public class testJavaHttpConn { 
    public static void main(String[] args) throws Exception { 
     String strUrl = args[0]; 
     System.out.println("Trying to connect to " + strUrl); 
     try { 
      URL url = new URL(strUrl); 
      HttpsURLConnection urlConn = (HttpsURLConnection) url.openConnection(); 
      System.out.println("Connecting"); 
      urlConn.connect(); 
      System.out.println("Done"); 
      System.out.println("Response " + urlConn.getResponseCode()); 
     } catch (IOException e) { 
      System.err.println("Error creating HTTP connection"); 
      e.printStackTrace(); 
      throw e; 
     } 
    } 
} 

Ich habe nicht Satz System.setProperty ("jsse.enableSNIExtension", "false"); und wenn ich -Djavax.net.debug = ssl einstelle, wird deutlich, dass die Server-Namenserweiterung nicht gesetzt ist.

Ich bin mir bewusst, dass ich eine SSLSocket implementieren und den SSLParameter serverName einstellen kann, wenn ich bereit bin, auf die nächste tiefere Abstraktionsebene zu tauchen, aber das möchte ich vermeiden.

Edit: Der Code funktioniert wie oben für Flo in den Kommentaren geschrieben. Es ist für mich mit 1.8.0_72 auf Linux 2.6.18-194.11.3.el5 und mit 1.8.0_51 auf Windows 7 fehlgeschlagen. Die Windows-Installation ist Vanille, während die Linux-Installation den Urandom-Wert auf securandandom.source = file aktualisiert hat: /dev/./urandom. Ich bin nicht sicher, wie ich feststellen kann, was bei meinen Installationen anders ist als bei Flo.

+0

So sind Sie für andere Methoden als die, die suchen [dokumentiert hier] (https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SNIExtension)? –

+0

Ich bin durch Ignoranz begrenzt. Die Code-Snippets, die SSLSocket verwenden, setzen das Wissen voraus, um alle vorherigen und folgenden Dinge zu erstellen, und mir fehlt das. Ich habe noch kein Beispiel gefunden, das zeigt, wie man das Verbinden und Abrufen mit SSLSocket durchführt und die Ausgabe in dasselbe Objekt konvertiert, das HttpURLConnection zurückgibt. Ich habe all diese Objekte nach diesen Schnipsel gebaut, kann aber nichts damit anfangen, wenn ich sie einmal habe. Angesichts meiner Ignoranz schien es mir klug zu fragen, ob ich irgendwo eine einfache Eigenschaft übersehen habe, die dazu führt, dass HttpsURLConnection SNI sendet. Wenn die Antwort nein ist, dann ist es SSLSocket. – codepoke

+1

Ich habe Ihren Code mit "https://sni.velox.ch" getestet und das Debug meldet 'Extension Servername, Servername: [Typ = Hostname (0), Wert = sni.velox.ch]'. Es ergibt sich der Status 200. Mit 'System.setProperty ("jsse.enableSNIExtension", "false") bekomme ich einen Fehler (wie erwartet) und die Erweiterung fehlt im Debug. System: Ubuntu Linux, Java 1.8.0_72 (hat aber auch mit 1.7.0_95 gearbeitet). Leider habe ich keine Lösung für dich. – flo

Antwort

3

HttpsURLConnection tut SNI standardmäßig senden und aus dem Kasten iff die URL, auf die sie verbindet ist ein voll qualifizierter Name ist. Es sendet das SNI für lokale Intranet-Kurznamen-Aliase nicht.

Extension server_name, server_name: [type=host_name (0), value=site.company.com] 

(Für das Protokoll, ich auch ein neues Zertifikat mit SANs für die kurzen und voll qualifizierten Namen zu implementieren benötigt, aber das war trivial.)