如何在Java8中注册自定义HostnameVerifier
我有一个Java6项目,其中的代码按预期工作如何在Java8中注册自定义HostnameVerifier,java,ssl,https,Java,Ssl,Https,我有一个Java6项目,其中的代码按预期工作 HostnameVerifier hv = new HostnameVerifier() { public boolean verify(String hostname, SSLSession session) { return true; } }; System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.in
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
HttpsURLConnection.setDefaultHostnameVerifier(hv);
但是,在另一个使用Java 8的项目中,它不能作为主机名验证程序工作。验证永远不会被调用。这两个项目都使用
org.apache.cxf.jaxrs.client.JAXRSClientFactory
来创建服务实例,以便执行对第三方API的请求如果您的目标是允许连接到具有无效SSL证书的站点,那么您需要的不仅仅是HostnameVerifier。您需要将设置为使用TrustManager初始化的上下文,该上下文将覆盖其所有检查。为什么要删除主机名测试?这样做会使您容易受到攻击,因为无论发生什么情况,基本上任何证书都是有效的。这样做会使您失去HTTPS的几乎所有用处,您也可以像使用HTTP一样好。@PatrickMevzek因为在我的本地develepomet环境中,我使用SSH隧道来访问这个第三方API,以便URL将请求发送到HTTP-ttps://localhost:some_port/...@VGR这是自Java6以来发生的变化吗?因为在使用Java 6的项目中,TrustManager和SSLContext类仅在实用程序类中使用(需要从CMD手动运行等),通过提供URL帮助开发人员安装证书,因此不需要手动将证书放入cacerts中。除此之外,TrustManager和SSLContext不在任何地方使用。”所以发送请求的URL变成了h-ttps://localhost:some_port/... “所以不要这样做。使用真实的主机名。在/etc/hosts
或全局DNS中。