我有一个 JavaFX 客户端,它需要使用通过 SSL 托管的 Web 服务,例如:https ://myserver.com/testservice/getdata 。
当我尝试从 JavaFX 客户端访问此服务时,出现异常:javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching localhost found
我搜索了这个异常,发现需要插入以下代码才能摆脱这个异常:
static {
//for localhost testing only
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(
new javax.net.ssl.HostnameVerifier(){
public boolean verify(String hostname,
javax.net.ssl.SSLSession sslSession) {
if (hostname.equals("localhost")) {
return true;
}
return false;
}
});
}
但是,此代码只是忽略服务的本地设置。您能否指导我缺少什么以便使用通过 SSL 托管的 RESTful 服务?
从 JavaFX 客户端,我尝试使用以下代码访问服务:
public List<String> getData() throws IOException
{
String servicesUrl = "https://myserver.com/testservice/getdata";
try
{
URL url = new URLservicesUrl
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK)
{
String data = restTemplate.getForObject(servicesUrl, String.class);
return data;
}
}
catch (IOException ioex)
{
ioex.printStackTrace();
}
}
我确实尝试过使用 HttpsURLConnection API,但没有任何成功。
我认为 JavaFX 客户端需要能够验证证书或进行某种握手,这由浏览器自动处理,但在这种情况下,胖客户端通过 https 将请求发送到 url。