SSL handshake alert: unrecognized_name error since upgrade to Java 1.7.0

前端 未结 17 3075
栀梦
栀梦 2020-11-22 06:35

I upgraded from Java 1.6 to Java 1.7 today. Since then an error occur when I try to establish a connection to my webserver over SSL:

javax.net.ssl.SSLProtoco         


        
17条回答
  •  春和景丽
    2020-11-22 07:01

    It should be useful. To retry on a SNI error in Apache HttpClient 4.4 - the easiest way we came up with (see HTTPCLIENT-1522):

    public class SniHttpClientConnectionOperator extends DefaultHttpClientConnectionOperator {
    
        public SniHttpClientConnectionOperator(Lookup socketFactoryRegistry) {
            super(socketFactoryRegistry, null, null);
        }
    
        @Override
        public void connect(
                final ManagedHttpClientConnection conn,
                final HttpHost host,
                final InetSocketAddress localAddress,
                final int connectTimeout,
                final SocketConfig socketConfig,
                final HttpContext context) throws IOException {
            try {
                super.connect(conn, host, localAddress, connectTimeout, socketConfig, context);
            } catch (SSLProtocolException e) {
                Boolean enableSniValue = (Boolean) context.getAttribute(SniSSLSocketFactory.ENABLE_SNI);
                boolean enableSni = enableSniValue == null || enableSniValue;
                if (enableSni && e.getMessage() != null && e.getMessage().equals("handshake alert:  unrecognized_name")) {
                    TimesLoggers.httpworker.warn("Server received saw wrong SNI host, retrying without SNI");
                    context.setAttribute(SniSSLSocketFactory.ENABLE_SNI, false);
                    super.connect(conn, host, localAddress, connectTimeout, socketConfig, context);
                } else {
                    throw e;
                }
            }
        }
    }
    

    and

    public class SniSSLSocketFactory extends SSLConnectionSocketFactory {
    
        public static final String ENABLE_SNI = "__enable_sni__";
    
        /*
         * Implement any constructor you need for your particular application -
         * SSLConnectionSocketFactory has many variants
         */
        public SniSSLSocketFactory(final SSLContext sslContext, final HostnameVerifier verifier) {
            super(sslContext, verifier);
        }
    
        @Override
        public Socket createLayeredSocket(
                final Socket socket,
                final String target,
                final int port,
                final HttpContext context) throws IOException {
            Boolean enableSniValue = (Boolean) context.getAttribute(ENABLE_SNI);
            boolean enableSni = enableSniValue == null || enableSniValue;
            return super.createLayeredSocket(socket, enableSni ? target : "", port, context);
        }
    }
    

    and

    cm = new PoolingHttpClientConnectionManager(new SniHttpClientConnectionOperator(socketFactoryRegistry), null, -1, TimeUnit.MILLISECONDS);
    

提交回复
热议问题