我有一个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();


我假定这是一个简单的更改,因为我可以在网络浏览器中请求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);

09-10 05:54
查看更多