2016-04-20 26 views
-1

Es gibt einen Legacy-Cisco IPS-Server, mit dem ich versuchen möchte, https zu verwenden. Das Problem ist dieser Server nur Händeschütteln mit bestimmten Bedingungen akzeptiert:Ist es möglich, den Erweiterungsteil von SSL-Handshakes in Java zu entfernen?

Die Version TLSv1.0 sein muss, muss die Cipher Suite SSL_RSA_WITH_RC4_128_MD5 oder SSL_RSA_WITH_RC4_128_SHA sein, und es darf keine Erweiterungen sein.

ich implementiert ein Hand-made „Client“, die die folgenden Informationen als Handshake (wireshark Ausgang) sendet:

Secure Sockets Layer 
TLSv1.2 Record Layer: Handshake Protocol: Client Hello 
    Content Type: Handshake (22) 
    Version: TLS 1.0 (0x0301) 
    Length: 45 
    Handshake Protocol: Client Hello 
     Handshake Type: Client Hello (1) 
     Length: 41 
     Version: TLS 1.0 (0x0301) 
     Random 
     Session ID Length: 0 
     Cipher Suites Length: 2 
     Cipher Suites (1 suite) 
     Compression Methods Length: 1 
     Compression Methods (1 method) 

Der Server sendet die Serverhello-Nachricht zurück.

Jetzt möchte ich Javas SSL-Implementierung verwenden, genau das gleiche ClientHello zu senden. Der folgende Code:

System.setProperty("https.protocols", "TLSv1"); 
    System.setProperty("javax.net.debug", "ssl:handshake"); 

    SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
    SSLSocket socket = (SSLSocket) factory.createSocket("ips-server", 443); 

    socket.setEnabledProtocols(new String[] {"TLSv1"}); 
    socket.setEnabledCipherSuites(new String[] {"SSL_RSA_WITH_RC4_128_MD5"}); 

    socket.startHandshake(); 

erzeugt den folgenden Handshake:

Secure Sockets Layer 
TLSv1.2 Record Layer: Handshake Protocol: Client Hello 
    Content Type: Handshake (22) 
    Version: TLS 1.0 (0x0301) 
    Length: 52 
    Handshake Protocol: Client Hello 
     Handshake Type: Client Hello (1) 
     Length: 48 
     Version: TLS 1.0 (0x0301) 
     Random 
     Session ID Length: 0 
     Cipher Suites Length: 2 
     Cipher Suites (1 suite) 
     Compression Methods Length: 1 
     Compression Methods (1 method) 
     Extensions Length: 5 
     Extension: renegotiation_info 
      Type: renegotiation_info (0xff01) 
      Length: 1 
      Renegotiation Info extension 

Dieser den Server bewirkt, dass das folgende Paket zurück senden:

TLSv1.2 Record Layer: Alert (Level: Fatal, Description: Handshake Failure) 

Ist es möglich zu machen Java nicht Senden Sie den "Extension" -Teil des Pakets?

+0

Die Einstellung 'https.protocols' hat keine Wirkung, wenn Sie' HttpsURLConnection' nicht verwenden. – EJP

Antwort

-1

Wenn jemand die Antwort wissen möchte, müssen Sie SSLv2Hello für https.protocols Systemeigenschaft verwenden.

System.setProperty("https.protocols", "TLSv1,SSLv2Hello"); 

habe ich den folgenden Code zu dem Server verbinden:

SSLContext sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(null, new TrustManager[] { new X509TrustManager() { 
    @Override 
    public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException { 
    } 

    @Override 
    public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException { 
    } 

    @Override 
    public X509Certificate[] getAcceptedIssuers() { 
     return null; 
    } 
} }, new SecureRandom()); 

SSLSocketFactory socketFactory = sslContext.getSocketFactory(); 
HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory); 

HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection(); 
conn.setHostnameVerifier(new HostnameVerifier() { 
    @Override 
    public boolean verify(String string, SSLSession ssls) { 
     return true; 
    } 
}); 

EDIT Mehr Erklärung - @EJP erwähnt, dass dieser Code nicht die Frage im Titel beantwortet. Ich habe einen kleinen Test geschrieben, um zu zeigen, ob der Erweiterungsteil des SSL-Clients hello als Nebeneffekt des Änderns des Clients Hallo zu SSLv2 entfernt wurde.

public static void main(String[] args) throws NoSuchAlgorithmException, KeyManagementException, MalformedURLException, IOException { 
    System.setProperty("https.protocols", "TLSv1,SSLv2Hello"); 

    String url = "https://www.google.com"; 

    SSLContext sslContext = SSLContext.getInstance("TLS"); 
    sslContext.init(null, new TrustManager[]{new X509TrustManager() { 
     @Override 
     public void checkClientTrusted(X509Certificate[] xcs, String string) { 
     } 

     @Override 
     public void checkServerTrusted(X509Certificate[] xcs, String string) { 
     } 

     @Override 
     public X509Certificate[] getAcceptedIssuers() { 
      return null; 
     } 
    }}, new SecureRandom()); 

    SSLSocketFactory socketFactory = sslContext.getSocketFactory(); 
    HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory); 

    HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection(); 
    conn.setHostnameVerifier(new HostnameVerifier() { 
     @Override 
     public boolean verify(String string, SSLSession ssls) { 
      return true; 
     } 
    }); 

    BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

    Stream<String> lines = br.lines(); 
    lines.forEach(l -> { System.out.println(l);}); 
} 

Dies ist, was ich in wireshark, wenn ich dieses Programm ausführen: enter image description here

Und wenn ich den SSLv2Client Teil auf Kommentar, würde ich diese: enter image description here

So klar diese erreicht, wonach ich gesucht habe: Entfernen des Erweiterungsteils des SSL-Handshakes. Vielleicht ist das nicht der beste Weg und da @EJP erwähnt eine Menge Sicherheitslücken einführt (nicht meine Angelegenheit hier, da mein CISCO IPS Server lokal ist und ich wollte nur eine Verbindung herstellen, sicher oder nicht), aber ich konnte nicht Finde irgendeinen anderen Weg, dies zu tun.

+0

Ihre Frage sagt nichts über SSLV2ClientHello oder HTTPS. Es gibt eine Möglichkeit, genau das für SSLSockets zu erreichen, aber das ist es nicht. Laut dem Test in Ihrer Frage ist SSLV2ClientHello nicht erforderlich. Es gibt hier nichts, was das, was es in Ihrem Titel sagt, auch erreicht. Alles, was Sie wirklich getan haben, ist die TLS-Version und die Verschlüsselungssuite, und es wurden mehrere eklatante Sicherheitslücken eingeführt. – EJP

+0

Vielen Dank, dass Sie sich die Zeit zum Lesen und Kommentieren genommen haben.Ich habe versucht, in meinem Schnitt mehr Erklärungen zu geben. – MNos