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