【问题标题】:Certificate chaining error in WebsphereWebsphere 中的证书链接错误
【发布时间】:2014-12-30 07:18:11
【问题描述】:

我正在尝试使用来自 url https://someurl.com 的 RESTful 服务。 我在代码中添加了以下属性:

 Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");
 Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl");
 Security.setProperty("javax.net.ssl.trustStore", "cacerts.jks");
 Security.setProperty("javax.net.ssl.keyStore", "keystore.jks");
 Security.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
 Security.setProperty("javax.net.ssl.trustStoreType", "JKS");

到目前为止我所做的配置更改是:

  1. com.ibm.websphere.ssl.retrieveLeafCert 设置为true
  2. 使用 url 作为 someurl 和端口 443 检索证书并将其添加到信任库。
  3. 重新启动服务器

但我得到以下异常:

java.security.cert.CertPathValidatorException: Certificate chaining error
javax.net.ssl.SSLHandshakeException: com.ibm.jsse2.util.h: PKIX path building failed:          java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl could not build a valid CertPath.; internal cause is:
  java.security.cert.CertPathValidatorException: The certificate issued by CN=Walmart Root CA, O=Wal-Mart Stores Inc is not trusted; internal cause is:
  java.security.cert.CertPathValidatorException: Certificate chaining error
  at com.ibm.jsse2.o.a(o.java:22)
  at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:423)
  at com.ibm.jsse2.kb.a(kb.java:192)
  at com.ibm.jsse2.kb.a(kb.java:176)
  at com.ibm.jsse2.lb.a(lb.java:53)
  at com.ibm.jsse2.lb.a(lb.java:464)
  at com.ibm.jsse2.kb.s(kb.java:545)
  at com.ibm.jsse2.kb.a(kb.java:530)
  at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:79)
  at com.ibm.jsse2.SSLSocketImpl.h(SSLSocketImpl.java:437)
  at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:142)
  at com.ibm.jsse2.SSLSocketImpl.startHandshake(SSLSocketImpl.java:686)
  at com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:98)
  at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:13)
  at com.ibm.net.ssl.www2.protocol.https.b.connect(b.java:6)
  at com.dwl.tcrm.tester.RESTClient_2.main(RESTClient_2.java:76)

【问题讨论】:

    标签: ssl-certificate websphere-7


    【解决方案1】:

    我假设您有一个 Web 应用程序,它正在尝试访问该 restful 服务。

    首先,您不应该通过javax.net.ssl.* 属性设置您的商店,而应该使用WebSphere 中提供的SSL 配置。所以评论所有这些setProperty() 电话。 其次,您必须将服务服务器证书添加到信任库。

    登录网络管理控制台:

    • 转到Security > SSL certificate and key management > Key stores and certificates > NodeDefaultTrustStore > Signer certificates
    • 点击Retrieve from port按钮,指定主机名、443端口和别名。
    • 点击Retrieve singer information按钮。
    • 验证是否导入了正确的证书(父级)。
    • 保存并重新启动。

    在某些版本中,子证书是导入的(不是根证书),在这种情况下,您将不得不手动下载根证书和中间证书(例如通过浏览器,然后将该证书导入NodeDefaultTrustStore,但这时间使用Add 按钮,而不是Retrieve..

    【讨论】:

    • 正如我在帖子中提到的,我已经将证书添加到了信任库中。但这没有任何区别。此外,我尝试通过独立的 Rest Client 访问该服务,它提供了同样的错误。
    • @AyanBiswas 但是您将其添加到(javax.net.ssl.trustStore", "cacerts.jks) 可能没有添加到NodeDefaultTrustStore 您是否删除了这些setProperty 调用?因为它们指向的存储与 WebSphere 使用的存储不同。而且您不应该将com.ibm.websphere.ssl.retrieveLeafCert 属性设置为true,因为链式证书的整个想法是使用根证书而不是叶子。
    • 我认为这个答案应该被接受,它确实为我解决了这个问题。
    • 大家好,我们遇到了类似的问题,安装了证书并得到了解决。但我们不明白问题是如何首先出现的。我们从过去 3 到 4 年一直在运行我们的应用程序,现在第一次看到这个问题。任何信息表示赞赏。
    • 我只能推测,4 年后有人更改了您尝试调用的目标服务上的证书(例如过期),您需要导入新的。
    【解决方案2】:

    这意味着您的证书未添加到 cacerts 中。尝试执行此命令为

    keytool -list -v -keystore your_path_to_cacerts (提供cacerts中的证书列表) 通过匹配您的证书的序列号进行检查。如果不存在,请按照以下步骤操作

    要导出中间证书:Internet Explorer -> 工具 -> Internet 选项 -> 内容 -> 证书 -> 查看证书路径:选择证书 -> 查看 -> 证书路径 -> 导出证书:选择证书 -> 导出 -> DER

    编码二进制格式 -> 保存(从 Firefox -> 工具 -> 选项 -> 高级 -> 加密 -> 查看证书) (此处给出 - http://www-01.ibm.com/support/docview.wss?uid=swg21592616)在此之后使用以下命令添加此导出的证书

    keytool -import -trustcacerts -Keystore CACERTS(path) -alias alias -file cert path 在步骤3中导出

    我的问题是一样的,我可以按照以下步骤解决它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 2017-12-18
      • 2015-09-08
      相关资源
      最近更新 更多