我有一个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
提前致谢!
答案 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);