Received fatal alert: handshake_failure through SSLHandshakeException

前端 未结 19 2178
暖寄归人
暖寄归人 2020-11-22 01:33

I have a problem with authorized SSL connection. I have created Struts Action that connects to external server with Client Authorized SSL certificate. In my Action I am tryi

19条回答
  •  情歌与酒
    2020-11-22 02:16

    I don't think this solves the problem to the first questioner, but for googlers coming here for answers:


    On update 51, java 1.8 prohibited[1] RC4 ciphers by default, as we can see on the Release Notes page:

    Bug Fix: Prohibit RC4 cipher suites

    RC4 is now considered as a compromised cipher.

    RC4 cipher suites have been removed from both client and server default enabled cipher suite list in Oracle JSSE implementation. These cipher suites can still be enabled by SSLEngine.setEnabledCipherSuites() and SSLSocket.setEnabledCipherSuites() methods. See JDK-8077109 (not public).

    If your server has a strong preference for this cipher (or use only this cipher) this can trigger a handshake_failure on java.

    You can test connecting to the server enabling RC4 ciphers (first, try without enabled argument to see if triggers a handshake_failure, then set enabled:

    import javax.net.ssl.SSLSocket;
    import javax.net.ssl.SSLSocketFactory;
    import java.io.*;
    
    import java.util.Arrays;
    
    /** 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 SSLRC4Poke {
        public static void main(String[] args) {
            String[] cyphers;
            if (args.length < 2) {
                System.out.println("Usage: "+SSLRC4Poke.class.getName()+"   enable");
                System.exit(1);
            }
            try {
                SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
                SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1]));
            
                cyphers = sslsocketfactory.getSupportedCipherSuites();
                if (args.length ==3){
                    sslsocket.setEnabledCipherSuites(new String[]{
                        "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5",
                        "SSL_DH_anon_WITH_RC4_128_MD5",
                        "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
                        "SSL_RSA_WITH_RC4_128_MD5",
                        "SSL_RSA_WITH_RC4_128_SHA",
                        "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
                        "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
                        "TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
                        "TLS_ECDH_RSA_WITH_RC4_128_SHA",
                        "TLS_ECDH_anon_WITH_RC4_128_SHA",
                        "TLS_KRB5_EXPORT_WITH_RC4_40_MD5",
                        "TLS_KRB5_EXPORT_WITH_RC4_40_SHA",
                        "TLS_KRB5_WITH_RC4_128_MD5",
                        "TLS_KRB5_WITH_RC4_128_SHA"
                    });     
                }
    
                InputStream in = sslsocket.getInputStream();
                OutputStream 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");
    
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }
    }
    

    1 - https://www.java.com/en/download/faq/release_changes.xml

提交回复
热议问题