我们的Web应用程序使用Jersey客户端API在内部调用多个Web服务。很少有服务是安全的,我们使用证书进行身份验证。
由于某些原因,我们希望在少数服务上禁用主机名验证。
所以我搜索了一些示例,发现以下链接,并且在禁用验证后服务按预期开始工作。
在浏览第三个链接时,我注意到对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?
}
}
};
答案 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);