如何禁用CXF 3.0.0+ JAX-RS 2.0客户端的CN检查

3

我不知道如何在CXF 3.0.4 JAX-RS 2.0客户端中编程地禁用CN检查。我的代码如下:

     System.setProperty("jsse.enableSNIExtension", "false"); 
        HttpsURLConnection.setDefaultHostnameVerifier( 
        new HostnameVerifier(){ 

            public boolean verify(String hostname, 
                    SSLSession sslSession) { 

                    return true; 
            
            } 
        }); 
            Client client = ClientBuilderImpl.newClient(); 
            String urlHost = "https://" + centralNode; 
            WebTarget target = client.target(urlHost).path(BASE_SERVICE_URL); 
            String encodedpw = Base64.encodeBase64String(passwd.getBytes()); 
            String body = "{\"uid\" : \"" + uid + "\",\"password\": \"" + encodedpw + "\"}"; 
            Response res = target.request(MediaType.APPLICATION_JSON).post(Entity.entity(body, MediaType.APPLICATION_JSON)); 

如您所见,我已经尝试覆盖默认的主机名验证器,并将jsse.enableSNIExtension设置为false。但这些都没有起作用,我仍然收到以下异常:

“https URL主机名与客户端信任库中服务器证书上的公共名称(CN)不匹配。请确保服务器证书正确,或者将CXF客户端TLS配置属性“disableCNCheck”设置为true以禁用此检查(不建议用于生产环境)。请帮助!”


1
您应该知道,禁用主机名检查实际上等同于禁用任何类型的证书验证,因为现在攻击者可以使用任何由可信CA签名的证书而不仅仅是与主机名匹配的那个证书。 - Steffen Ullrich
1个回答

6
你正在寻找这段代码片段;
       HTTPConduit httpConduit=(HTTPConduit)ClientProxy.getClient(SAMPLE_PORT).getConduit();
       TLSClientParameters tlsCP = new TLSClientParameters();
       tlsCP.setDisableCNCheck(true);
       httpConduit.setTlsClientParameters(tlsCP);

在测试环境中始终使用此代码。


一个SAMPLE_PORT应该长什么样子?我是新手,需要尝试一下才能解决这个问题。 - Dark Star1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接