Extended server_name (SNI Extension) not sent with jdk1.8.0 but send with jdk1.7.0

后端 未结 5 926
旧时难觅i
旧时难觅i 2020-11-27 07:53

I have implemented a JAX-WS client by using ApacheCXF (v3.0.4) and everything works successfully but the problem comes when I want to use a secure connection (SSL/TLS) with

5条回答
  •  清歌不尽
    2020-11-27 08:11

    As mentioned, the cause is related to the JDK bug where using setHostnameVerifier() breaks SNI (Extension server_name). https://bugs.openjdk.java.net/browse/JDK-8144566

    Our workaround: After testing we found that setting a connection's SSLSocketFactory to just about anything from the default seems to fix the issue.

    This does not work: HttpsURLConnection.setSSLSocketFactory((SSLSocketFactory) SSLSocketFactory.getDefault());

    This does work: HttpsURLConnection.setSSLSocketFactory(new SSLSocketFactoryFacade());

    So, to fix it for a JAX-WS client, you could do something like this: bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", new SSLSocketFactoryFacade());

    Our SSLSocketFactory facade: (Note that it really doesn't do anything)

    public class SSLSocketFactoryFacade extends SSLSocketFactory {
    
        SSLSocketFactory sslsf;
    
        public SSLSocketFactoryFacade() {
            sslsf = (SSLSocketFactory) SSLSocketFactory.getDefault();;
        }
    
        @Override
        public String[] getDefaultCipherSuites() {
            return sslsf.getDefaultCipherSuites();
        }
    
        @Override
        public String[] getSupportedCipherSuites() {
            return sslsf.getSupportedCipherSuites();
        }
    
        @Override
        public Socket createSocket(Socket socket, String s, int i, boolean b) throws IOException {
            return sslsf.createSocket(socket, s, i, b);
        }
    
        @Override
        public Socket createSocket(String s, int i) throws IOException, UnknownHostException {
            return sslsf.createSocket(s, i);
        }
    
        @Override
        public Socket createSocket(String s, int i, InetAddress inetAddress, int i1) throws IOException, UnknownHostException {
            return sslsf.createSocket(s, i, inetAddress, i1);
        }
    
        @Override
        public Socket createSocket(InetAddress inetAddress, int i) throws IOException {
            return createSocket(inetAddress, i);
        }
    
        @Override
        public Socket createSocket(InetAddress inetAddress, int i, InetAddress inetAddress1, int i1) throws IOException {
            return createSocket(inetAddress, i, inetAddress1, i1);
        }
    }
    

提交回复
热议问题