SSL Handshake failure with Java version “1.7.0_79”

前端 未结 2 1424
孤独总比滥情好
孤独总比滥情好 2020-12-21 07:23

I am communicating with one of the host in Java using Apache HttpClient and it is throwing handshake_failure. The full trace is

trigger

2条回答
  •  感情败类
    2020-12-21 08:01

    To add to Anand Bhat's answer, I am showing the diff in client ciphers enabled with the download of Oracle JDK7 Unlimited Strength policy JARs. However, some servers agree to proceed only with newer ciphers even under TLSv1.2. In particular, the latest publically available JDK 7 build 80 does not support "GCM cipher suites", resulting in a javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure.

    TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
    TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
    TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
    TLS_DHE_DSS_WITH_AES_128_GCM_SHA256
    TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
    TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 
    

    https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8180834

    $ diff -U 1000000 -u ciphers-jdk7-80-orig.txt ciphers-jdk7-80-unlimited.txt
    --- ciphers-jdk7-80-orig.txt    2019-01-17 16:03:52.328738900 -0500
    +++ ciphers-jdk7-80-unlimited.txt       2019-01-17 16:05:37.783770600 -0500
    @@ -1,64 +1,81 @@
    + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
    + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
    + TLS_RSA_WITH_AES_256_CBC_SHA256
    + TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
    + TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
    + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
    + TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
    + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
    + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
    + TLS_RSA_WITH_AES_256_CBC_SHA
    + TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
    + TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
    + TLS_DHE_RSA_WITH_AES_256_CBC_SHA
    + TLS_DHE_DSS_WITH_AES_256_CBC_SHA
      TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
      TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
      TLS_RSA_WITH_AES_128_CBC_SHA256
      TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
      TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
      TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
      TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
      TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
      TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
      TLS_RSA_WITH_AES_128_CBC_SHA
      TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
      TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
      TLS_DHE_RSA_WITH_AES_128_CBC_SHA
      TLS_DHE_DSS_WITH_AES_128_CBC_SHA
      TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
      TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
      SSL_RSA_WITH_3DES_EDE_CBC_SHA
      TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
      TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
      SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
      SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA
      TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
      TLS_ECDHE_RSA_WITH_RC4_128_SHA
      SSL_RSA_WITH_RC4_128_SHA
      TLS_ECDH_ECDSA_WITH_RC4_128_SHA
      TLS_ECDH_RSA_WITH_RC4_128_SHA
      SSL_RSA_WITH_RC4_128_MD5
      TLS_EMPTY_RENEGOTIATION_INFO_SCSV
    + TLS_DH_anon_WITH_AES_256_CBC_SHA256
    + TLS_ECDH_anon_WITH_AES_256_CBC_SHA
    + TLS_DH_anon_WITH_AES_256_CBC_SHA
      TLS_DH_anon_WITH_AES_128_CBC_SHA256
      TLS_ECDH_anon_WITH_AES_128_CBC_SHA
      TLS_DH_anon_WITH_AES_128_CBC_SHA
      TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA
      SSL_DH_anon_WITH_3DES_EDE_CBC_SHA
      TLS_ECDH_anon_WITH_RC4_128_SHA
      SSL_DH_anon_WITH_RC4_128_MD5
      SSL_RSA_WITH_DES_CBC_SHA
      SSL_DHE_RSA_WITH_DES_CBC_SHA
      SSL_DHE_DSS_WITH_DES_CBC_SHA
      SSL_DH_anon_WITH_DES_CBC_SHA
      SSL_RSA_EXPORT_WITH_RC4_40_MD5
      SSL_DH_anon_EXPORT_WITH_RC4_40_MD5
      SSL_RSA_EXPORT_WITH_DES40_CBC_SHA
      SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
      SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
      SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA
      TLS_RSA_WITH_NULL_SHA256
      TLS_ECDHE_ECDSA_WITH_NULL_SHA
      TLS_ECDHE_RSA_WITH_NULL_SHA
      SSL_RSA_WITH_NULL_SHA
      TLS_ECDH_ECDSA_WITH_NULL_SHA
      TLS_ECDH_RSA_WITH_NULL_SHA
      TLS_ECDH_anon_WITH_NULL_SHA
      SSL_RSA_WITH_NULL_MD5
      TLS_KRB5_WITH_3DES_EDE_CBC_SHA
      TLS_KRB5_WITH_3DES_EDE_CBC_MD5
      TLS_KRB5_WITH_RC4_128_SHA
      TLS_KRB5_WITH_RC4_128_MD5
      TLS_KRB5_WITH_DES_CBC_SHA
      TLS_KRB5_WITH_DES_CBC_MD5
      TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA
      TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5
      TLS_KRB5_EXPORT_WITH_RC4_40_SHA
      TLS_KRB5_EXPORT_WITH_RC4_40_MD5
    
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocket;
    import javax.net.ssl.SSLSocketFactory;
    
    import java.security.SecureRandom;
    import java.security.NoSuchAlgorithmException;
    import java.security.KeyManagementException;
    
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.IOException;
    
    /** Establish a SSL connection to a host and port, writes a byte and
     * prints the response. See
     * http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services
     */
    public class SSLPoke {
        public static void main(String[] args) throws IOException, NoSuchAlgorithmException, KeyManagementException {
            if (args.length != 2) {
                System.out.println("Usage: "+SSLPoke.class.getName()+"  ");
                System.exit(1);
            }
            InputStream in = null;
            OutputStream out = null;
            try {
                SSLSocketFactory sslSocketFactory;
                if (true) {
                    // https://www.baeldung.com/java-7-tls-v12
                    SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
                    sslContext.init(null, null, new SecureRandom());
    
                    sslSocketFactory = sslContext.getSocketFactory();
                } else {
                    sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
                    // This will cause an exception on connecting to a TLSv1.2-only server,
                    // Exception in thread "main" javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
                    //         at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:953)
                    //         at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
                    //         at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:709)
                    //         at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)
                    //         at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:136)
                    //         at SSLPoke.main(SSLPoke.java:66)
                    // Caused by: java.io.EOFException: SSL peer shut down incorrectly
                    //         at sun.security.ssl.InputRecord.read(InputRecord.java:482)
                    //         at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934)
                    //         ... 5 more
                }
                SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket(args[0], Integer.parseInt(args[1]));
    
                // https://gist.github.com/lanimall/cb808a11a058f7fb620a#file-gistfile1-java
                String[] protocols = sslSocket.getSupportedProtocols();
    
                System.out.println("Supported Protocols: " + protocols.length);
                for(int i = 0; i < protocols.length; i++)
                {
                    System.out.println(" " + protocols[i]);
                }
    
                protocols = sslSocket.getEnabledProtocols();
    
                System.out.println("Enabled Protocols: " + protocols.length);
                for(int i = 0; i < protocols.length; i++)
                {
                    System.out.println(" " + protocols[i]);
                }
    
                String[] ciphers = sslSocket.getSupportedCipherSuites();
                System.out.println("Enabled Ciphers: " + ciphers.length);
                for(int i = 0; i < ciphers.length; i++)
                {
                    System.out.println(" " + ciphers[i]);
                }
    
                in = sslSocket.getInputStream();
                out = sslSocket.getOutputStream();
    
                // Write a test byte to get a reaction :)
                out.write(1);
    
                while (in.available() > 0) {
                    System.out.print(in.read());
                }
                System.out.println("Successfully connected");
    
            } finally {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
            }
        }
    }
    

提交回复
热议问题