Java Servlet中的SSL握手(HttpsURLConnection)

时间:2015-06-17 17:57:55

标签: java servlets ssl

我有一个java Web应用程序,它需要一个servlet来打开一个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

提前致谢!

1 个答案:

答案 0 :(得分:0)

因此,每当建立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);