Tomcat Spring中的SSLSocket

时间:2012-03-22 08:44:06

标签: java spring sockets ssl

我尝试在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);)

我做错了什么?

2 个答案:

答案 0 :(得分:1)

这意味着您连接的服务器没有来自授权CA的有效证书。 您必须检查您的信任库是否包含证书的CA证书。

Here你可以找到关于这个主题的教程。

答案 1 :(得分:-2)

Tomas Narros告诉你原因。这是一种收集服务证书(链)甚至完全忽略它的方法。

使用implements javax.net.ssl.X509TrustManager

创建一个TrustManager类

您将在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(...);