Javaservlet中的SSL握手(HttpsURLConnection)
我有一个java web应用程序,它需要一个servlet来打开一个与url的连接,该url以JSON的形式返回一些数据给servlet进行处理。传统上,这是使用HttpURLConnection完成的,一切都按计划进行 现在,我们已经将自签名SSL证书添加到服务器中,我们将在其中为JSON数据建立连接。我的问题只是如何进行这种新的HTTPS连接。需要注意的是,当实际部署应用程序时,它将连接合法的SSL证书 下面是自签名SSL证书之前HttpURLConnection如何工作的示例代码Javaservlet中的SSL握手(HttpsURLConnection),java,servlets,ssl,Java,Servlets,Ssl,我有一个java web应用程序,它需要一个servlet来打开一个与url的连接,该url以JSON的形式返回一些数据给servlet进行处理。传统上,这是使用HttpURLConnection完成的,一切都按计划进行 现在,我们已经将自签名SSL证书添加到服务器中,我们将在其中为JSON数据建立连接。我的问题只是如何进行这种新的HTTPS连接。需要注意的是,当实际部署应用程序时,它将连接合法的SSL证书 下面是自签名SSL证书之前HttpURLConnection如何工作的示例代码
URL url = new URL("HTTP SERVER URL GOES HERE");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
下面是我如何更改HTTPS连接的:
URL url = new URL("HTTPS SERVER URL GOES HERE");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
我假设这将是一个简单的更改,因为我可以在web浏览器中请求URL(返回JSON数据的URL)。为什么这在Java中不起作用
尝试发出请求时,我收到SSLHandshakeException:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching "SERVER HERE" found
提前谢谢 因此,每当建立SSL连接时,它都会尝试使用证书中的主机名验证服务器名。在这种情况下,由于它是自签名的,所以可能没有任何服务器名称 您需要做的是编写一个
javax.net.ssl.HostnameVerifier
的实现,并分配给您的HttpsURLConnection
可以编写此HostnameVerifier,使其始终返回true或基于您喜欢的任何条件
final HostnameVerifier hv=new HostnameVerifier(){
public boolean verify( final String arg0, final SSLSession arg1){
return true;
}
}
并且,如下所示分配给HttpsURLConnection:
URL url = new URL("HTTPS SERVER URL GOES HERE");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setHostnameVerifier(hv);
因此,无论何时建立SSL连接,它都会尝试使用证书中的主机名验证服务器名。在这种情况下,由于它是自签名的,所以可能没有任何服务器名称 您需要做的是编写一个
javax.net.ssl.HostnameVerifier
的实现,并分配给您的HttpsURLConnection
可以编写此HostnameVerifier,使其始终返回true或基于您喜欢的任何条件
final HostnameVerifier hv=new HostnameVerifier(){
public boolean verify( final String arg0, final SSLSession arg1){
return true;
}
}
并且,如下所示分配给HttpsURLConnection:
URL url = new URL("HTTPS SERVER URL GOES HERE");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setHostnameVerifier(hv);
尝试此解决方案后生成此错误:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径hh,证书必须在您的受信任证书中,即在客户端受信任证书中。您知道如何做到这一点。实现这一点的最佳方法是什么,我对SSL不太熟悉,而且有点不知所措。好的,您使用的是什么服务器?服务器配置可能会在某个地方定义信任存储路径。后来,,您必须将此自签名证书导入该信任存储。尝试此解决方案后,生成了以下错误:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到有效的证书到请求目标的路径Hh,证书必须在您的受信任证书中,即在客户端受信任证书中。您知道如何做到这一点。实现这一点的最佳方法是什么,我不熟悉SSL,而且它有点难以控制。好的,您使用的服务器是什么?服务器配置可能会在某个地方定义信任存储路径。后来,,您必须将此自签名证书导入该信任存储。尝试此解决方案后,生成了以下错误:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到有效的证书到请求目标的路径Hh,证书必须在您的受信任证书中,即在客户端受信任证书中。您知道如何做到这一点。实现这一点的最佳方法是什么,我不熟悉SSL,而且它有点难以控制。好的,您使用的服务器是什么?服务器配置可能会在某个地方定义信任存储路径。稍后,您必须将此自签名证书导入该信任存储。