Java 禁用主机名验证

Java 禁用主机名验证,java,jakarta-ee,ssl-certificate,httpurlconnection,websphere-liberty,Java,Jakarta Ee,Ssl Certificate,Httpurlconnection,Websphere Liberty,我们的web应用程序使用Jersey客户端API在内部调用多个web服务。很少有服务是安全的,我们使用证书进行身份验证 由于某些原因,我们希望在少数服务上禁用主机名验证 因此,我搜索了一些示例,找到了以下链接,在禁用验证后,服务开始按预期工作 , 在浏览第三个链接时,我注意到调用了HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid) 我假设,由于上述调用,所有后续web服务调用都将禁用主机名验证 如果我的假设是正确的,那么如何仅

我们的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?
     }
    } 
};

在您直接使用HttpsUrlConnection的情况下,一旦打开连接(使用
URL.openConnection()
),您就可以调用
connection.setHostnameVerifier(allHostsValid)
,为单个连接设置主机名验证器

编辑:

当您使用Jersey时,根据您使用的是Jersey 1还是Jersey 2,似乎有两个选项

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

ClientBuilder.newBuilder().hostnameVerifier(allHostsValid).build();
您可能希望创建两个客户端,并根据连接到的服务使用不同的客户端。但是,在中有一个警告,注意这只适用于某些连接器提供程序,我不确定您将使用哪个

这是一个很好的解决方案,因此它应该适用于任何兼容的JAX-RS2.0客户端(包括Liberty的
jaxrsClient-2.0
功能)

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

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

我们正在使用Jersey客户端。所以我想我必须想出一个方法,告诉泽西只在当前连接时这样做。谢谢抱歉,我没有注意到您正在使用Jersey客户端,直接跳到您调用的部分
HttpsURLConnection.setDefaultHostnameVerifier
。我已经用一些关于Jersey和其他JAX-RS客户机的信息更新了答案,虽然我自己没有实现过,当然没问题。我会尽力确认。如果jersey不提供任何选项,我将使用HttpURLConnection类