我尝试在Spring容器中切换到SSL套接字:
SSLSocketFactory f = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket c = (SSLSocket) f.createSocket(socket, srvAddr, srvPort,true);
并收到以下错误:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:PKIX路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到所请求目标的有效证书路径
其中socket是alredy打开普通套接字(new Socket(srvAddr,srvPort);)
我做错了什么?
答案 0 :(得分:1)
这意味着您连接的服务器没有来自授权CA的有效证书。 您必须检查您的信任库是否包含证书的CA证书。
Here你可以找到关于这个主题的教程。
答案 1 :(得分:-2)
Tomas Narros告诉你原因。这是一种收集服务证书(链)甚至完全忽略它的方法。
使用implements javax.net.ssl.X509TrustManager
您将在checkServerTrusted(X509Certificate[] chain, String authType)
中收到服务器证书链。在此方法中,您可以编写简单的代码来保存收到的证书。如果您不想验证它们,只需返回而不抛出异常。
要实现您的TrustManager,请执行以下操作
TrustManager[] myTrustManager = { new MyTrustManager() };
SSLContext ctx = SSLContext.getInstance("TLS");
if (sendClientCerts) { //send my certs for authentication to the server
X509KeyManager kmsd = ...
ctx.init(kmsd, myTrustManager, null);
}
else {
ctx.init(null, myTrustManager, null);
}
// Finally get a SSL Socket Factory and return it
SSLScketFactory ssf = ctx.getSocketFactory();
SSLSocket socket = ssf.createSocket(...);