Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat弹簧中的SSLSocket_Java_Spring_Sockets_Ssl - Fatal编程技术网

Java Tomcat弹簧中的SSLSocket

Java Tomcat弹簧中的SSLSocket,java,spring,sockets,ssl,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.validator异常:

我尝试切换到Spring容器中的SSL套接字:

SSLSocketFactory f = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket c = (SSLSocket) f.createSocket(socket, srvAddr, srvPort,true);
并获取以下错误:

javax.net.ssl.SSLHandshakeException: sun.security.validator.validator异常:PKIX路径生成失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效证书路径

其中,插座是完全打开的普通插座(新插座(srvAddr、srvPort);)


我做错了什么?

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


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

托马斯·纳罗斯给了你理由。下面是一种收集服务证书(链)甚至完全忽略它的方法

使用implements
javax.net.ssl.X509TrustManager创建一个TrustManager类

您将在
checkServerTrusted(X509Certificate[]链,字符串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(...);

问题是我连接到用C编写的服务器。因此我无法通过浏览器导出证书。@Max服务器用C编写这一事实与您导出证书的能力无关。如果它的证书没有CA签名,那么让您信任它是服务器人员的问题。如果它是您的服务器,那就是您的问题,答案是从服务器导出它并将其导入客户端的信任库。无论如何,您需要CAs证书。如果无法通过浏览器导出,服务器支持团队应该能够将其发送给您。或者您可以使用openssl之类的工具来获取它们。@EJP这就是我的意思,但解释得更好。谢谢。这些都不能解决问题。它只会让事情变得更加不安全,这是朝着错误的方向发展的;我给出了一个程序化的解决方案。然后实现您自己的TrustManager,您实际上可以根据需要执行验证时更好地控制安全性。如果您以前在Java中使用过低级SSL,我怀疑您不会称之为“摆弄”。@BGR那么您就错了,因为我以前在Java中使用过低级SSL,我称之为“摆弄”。我见过的99%的定制信任管理器不仅根本不安全,甚至不符合其自身的规范。@Downvoter和EJP。OP从未询问过他的应用程序的安全性应该是什么,更不用说您对实现TrustManager的程序员的看法了。OP只是在寻找切实可行的解决方案,他足够聪明,能够理解什么对他有效,什么对他无效。正如StackOverflow使用章程中所解释的,实际上表达意见是毫无意义的:您是否注意到OP接受了这个答案,以及EJP在其第一次评论中表达的意见如何被证明是完全错误的?