禁用主机名验证

时间:2017-04-06 12:00:05

标签: java java-ee ssl-certificate httpurlconnection websphere-liberty

我们的Web应用程序使用Jersey客户端API在内部调用多个Web服务。很少有服务是安全的,我们使用证书进行身份验证。

由于某些原因,我们希望在少数服务上禁用主机名验证。

所以我搜索了一些示例,发现以下链接,并且在禁用验证后服务按预期开始工作。

Link1link2link3

在浏览第三个链接时,我注意到对HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid)的调用;

我假设,由于上述调用,所有后续Web服务调用都将禁用主机名验证。

如果我的假设是正确的,如何仅对特定服务禁用验证?

HostnameVerifier allHostsValid = new HostnameVerifier() { 
    public boolean verify(String hostname, SSLSession session) {
     if(hostname.equals("xyz")) {
         return true; 
     } else {
         // How do I implement this section?
         // if I return false will the server perform the verification? If not how do I implement this?
     }
    } 
};

1 个答案:

答案 0 :(得分:1)

在您正在使用HttpsUrlConnection时,一旦打开连接(使用URL.openConnection()),您可以调用connection.setHostnameVerifier(allHostsValid)为该单个连接设置主机名验证程序。

编辑:

当你使用泽西时,看起来有两种选择取决于你是使用泽西1还是2。

对于Jersey 2,您可以在创建客户端时在ClientBuilder上设置主机名验证程序。

ClientBuilder.newBuilder().hostnameVerifier(allHostsValid).build();

您需要创建两个客户端,并根据您连接的服务使用不同的客户端。但是,jersey docs中有一条警告,指出这只适用于某些连接器提供商,而且我不确定您使用的是什么。

这是standard API所以它适用于任何兼容的JAX-RS 2.0客户端(包括Liberty的jaxrsClient-2.0功能)。

对于Jersey 1,看起来您可以在客户端或客户端请求上设置属性。

HTTPSProperties httpsProps = new HTTPSProperties(allHostsValid);
client.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, httpsProps);