您的问题是客户端和服务器端的 SSL 配置。SSL 握手问题与您的 Web 服务配置无关:Web 服务通过 HTTP,并且是HttpsURLConnection
处理此问题的 java。
2 次 SSL 握手需要:
客户端
- 服务器证书应该在密钥库中,或者您可以在使用 Web 服务客户端之前按照说明设置此验证:
代码:
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
}
} };
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
}
- 服务器证书“服务器名称”必须与您用于访问 Web 服务端点 (
checkURLSpoofing
) 的 URL 匹配,或者在使用服务客户端之前关闭此验证设置
代码:
// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
- 配置客户端以正确发送其证书。在使用 Web 服务客户端之前进行设置
代码:
System.setProperty("javax.net.ssl.keyStore", "path/to/your/key");
System.setProperty("javax.net.ssl.keyStorePassword", "your-keystore-password");
System.setProperty("javax.net.ssl.keyStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "path/to/your/trust/keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "your-truststore-password");
System.setProperty("com.sun.net.ssl.dhKeyExchangeFix", "true");
服务器端
这应该可以工作,如果您仍然遇到问题,请添加堆栈跟踪(客户端和服务器)以查看发生了什么。