0

我们的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

在你使用HttpsURLConnection的直接那么一旦你打开的连接(与URL.openConnection()),你可以调用connection.setHostnameVerifier(allHostsValid)设置主机名校验为单个连接。

编辑:

当你使用泽西,它看起来像有具体取决于你使用的泽西1或2

泽西岛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); 
+0

我们使用的是Jersey客户端。所以我认为我必须找出一种方法来告诉球衣只为当前的连接做。谢谢 –

+0

对不起,我错过了你正在使用Jersey客户端,直接跳到你调用'HttpsURLConnection.setDefaultHostnameVerifier'的部分。我已经更新了有关Jersey和其他JAX-RS客户端的一些信息的答案,尽管这不是我自己实现的。 – Azquelt

+0

当然没问题。我会尝试识别。如果球衣不提供任何选项,我将使用HttpURLConnection类 –