Javaservlet中的SSL握手(HttpsURLConnection)

Javaservlet中的SSL握手(HttpsURLConnection),java,servlets,ssl,Java,Servlets,Ssl,我有一个java web应用程序,它需要一个servlet来打开一个与url的连接,该url以JSON的形式返回一些数据给servlet进行处理。传统上,这是使用HttpURLConnection完成的,一切都按计划进行 现在,我们已经将自签名SSL证书添加到服务器中,我们将在其中为JSON数据建立连接。我的问题只是如何进行这种新的HTTPS连接。需要注意的是,当实际部署应用程序时,它将连接合法的SSL证书 下面是自签名SSL证书之前HttpURLConnection如何工作的示例代码

我有一个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,而且它有点难以控制。好的,您使用的服务器是什么?服务器配置可能会在某个地方定义信任存储路径。稍后,您必须将此自签名证书导入该信任存储。