【问题标题】:SSLSocket in Tomcat SpringTomcat Spring 中的 SSLSocket
【发布时间】:2012-03-22 08:44:05
【问题描述】:

我尝试在我的 Spring Container 中切换到 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已经打开正常socket(new Socket(srvAddr, srvPort);)

我做错了什么?

【问题讨论】:

    标签: java spring sockets ssl


    【解决方案1】:

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

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

    【讨论】:

    • 问题是我连接到用C编写的服务器。所以我无法通过浏览器导出证书。
    • @Max 服务器是用 C 语言编写的这一事实与您导出其证书的能力无关。如果它的证书没有由 CA 签名,那么服务器人员的问题就是让你信任它。如果是你的服务器,那就是你的问题,答案是从服务器导出,然后导入到客户端的信任库中。
    • 无论如何,您都需要 CA 证书。如果您无法通过浏览器导出它们,服务器支持团队应该能够将其发送给您。或者你可以使用一些工具作为 openssl 来获取它们。
    • @EJP 这就是我的意思,但更好的解释。谢谢。
    【解决方案2】:

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

    使用实现 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(...);
    

    【讨论】:

    • 摆弄TrustManagers并不能解决问题。它只会让事情变得更加不安全,这是朝着错误的方向发展。
    • 也许你应该读两遍:OP问题是恢复证书;我给出了一个程序化的解决方案。然后实施您自己的 TrustManager,您实际上可以在根据需要执行验证时更好地控制安全性。如果您以前在 Java 中使用过低级 SSL,我怀疑您不会称其为“摆弄”。
    • @BGR 那么你就错了,因为我之前在 Java 中做过低级 SSL,我确实称之为“摆弄”。我见过的 99% 的自定义 TrustManager 不仅根本不安全,而且甚至不符合自己的规范。
    • @Downvoter 和 EJP。 OP 从来没有征求过关于他的应用程序的安全性应该是什么的意见,更不用说你对实现 TrustManagers 的程序员的看法了。 OP 只是在寻找实用的解决方案,并且足够聪明,可以理解什么对他有效,什么对他无效。正如 StackOverflow 使用章程中所解释的那样,实际上表达意见是没有意义的:您是否注意到 OP 接受了这个答案,以及 EJP 在他的第一条评论中表达的意见如何被证明是完全错误的?
    猜你喜欢
    • 2012-11-09
    • 2017-06-24
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多