【问题标题】:certificate not trusted by WebsphereWebsphere 不信任的证书
【发布时间】:2014-02-15 15:39:07
【问题描述】:

我有一个 Web 应用程序,它调用通过 SSL 保护的 SOAP Web 服务。(https://zzzzzzzzzzzz/xxxxx)。

服务器发送两个证书(根和叶),所以我使用属性导入两个证书:com.ibm.websphere.ssl.retrieveLeafCert

要在 websphere 上启用 ssl 验证,我只需将证书添加到 websphere 中:

SSL 证书和密钥管理 -> 密钥存储和证书 -> NodeDefaultTrustStore -> 签名者证书 -> 从端口检索:

  • 主机:主机名
  • 端口:443
  • 别名:别名

问题是 webshphere 不信任证书并给我这个堆栈跟踪,

used by: javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking `https://------------------------------` : com.ibm.jsse2.util.j: PKIX path building failed: java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl could not build a valid CertPath.; internal cause is: 
    java.security.cert.CertPathValidatorException: T`he certificate issued by CN=-------------------------------------------------------------------- is not trusted`; internal cause is: 
    java.security.cert.CertPathValidatorException: Certificate chaining error
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.6.0]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:56) ~[na:1.6.0]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:39) ~[na:1.6.0]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:527) ~[na:1.6.0]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1338) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1322) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:622) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.endpoint.ClientImpl.invokeWrapped(ClientImpl.java:354) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.jaxws.DispatchImpl.invoke(DispatchImpl.java:385) ~[cxf-rt-frontend-jaxws-2.7.4.jar:2.7.4]
    ... 100 common frames omitted
`Caused by: javax.net.ssl.SSLHandshakeException`: com.ibm.jsse2.util.j: 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=--------------------------------------------------------- is not trusted`; internal cause is: 
    java.security.cert.CertPathValidatorException: Certificate chaining error
    at com.ibm.jsse2.o.a(o.java:8) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:549) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.kb.a(kb.java:355) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.kb.a(kb.java:130) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.lb.a(lb.java:135) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.lb.a(lb.java:368) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.kb.s(kb.java:442) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.kb.a(kb.java:136) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:495) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.SSLSocketImpl.h(SSLSocketImpl.java:223) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:724) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.SSLSocketImpl.startHandshake(SSLSocketImpl.java:81) ~[na:6.0 build_20130515]
    at com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:8) ~[na:6.0 build_20130515]
    at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:20) ~[na:6.0 build_20130515]
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1043) ~[na:1.6.0]
    at com.ibm.net.ssl.www2.protocol.https.b.getOutputStream(b.java:85) ~[na:6.0 build_20130515]
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.java:168) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1282) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1233) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:195) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69) ~[cxf-api-2.7.4.jar:2.7.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1295) ~[cxf-rt-transports-http-2.7.4.jar:2.7.4]
    ... 110 common frames omitted
`Caused by: com.ibm.jsse2.util.j: PKIX path building failed:` java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl could not build a valid CertPath.; internal cause is: 
    java.security.cert.CertPathValidatorException: T`he certificate issued by CN=--------------------------------------------  is not trusted`; internal cause is: 
    java.security.cert.CertPathValidatorException: Certificate chaining error
    at com.ibm.jsse2.util.h.b(h.java:39) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.util.h.b(h.java:21) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.util.g.a(g.java:1) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.pc.a(pc.java:36) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.pc.checkServerTrusted(pc.java:19) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.pc.b(pc.java:51) ~[na:6.0 build_20130515]
    at com.ibm.jsse2.lb.a(lb.java:65) ~[na:6.0 build_20130515]
    ... 128 common frames omitted
Caused by: java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl could not build a valid CertPath.
    at com.ibm.security.cert.PKIXCertPathBuilderImpl.engineBuild(PKIXCertPathBuilderImpl.java:411) ~[na:na]
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:258) ~[na:na]
    at com.ibm.jsse2.util.h.b(h.java:107) ~[na:6.0 build_20130515]
    ... 134 common frames omitted
Caused by: java.security.cert.CertPathValidatorException: The certificate issued by CN=-------------------------------------------------------
    at com.ibm.security.cert.BasicChecker.<init>(BasicChecker.java:111) ~[na:na]
    at com.ibm.security.cert.PKIXCertPathValidatorImpl.engineValidate(PKIXCertPathValidatorImpl.java:178) ~[na:na]
    at com.ibm.security.cert.PKIXCertPathBuilderImpl.myValidator(PKIXCertPathBuilderImpl.java:737) ~[na:na]
    at com.ibm.security.cert.PKIXCertPathBuilderImpl.buildCertPath(PKIXCertPathBuilderImpl.java:649) ~[na:na]
    at com.ibm.security.cert.PKIXCertPathBuilderImpl.buildCertPath(PKIXCertPathBuilderImpl.java:595) ~[na:na]
    at com.ibm.security.cert.PKIXCertPathBuilderImpl.engineBuild(PKIXCertPathBuilderImpl.java:357) ~[na:na]
    ... 136 common frames omitted
Caused by: java.security.cert.CertPathValidatorException: Certificate chaining error
    at com.ibm.security.cert.CertPathUtil.findIssuer(CertPathUtil.java:298) ~[na:na]
    at com.ibm.security.cert.BasicChecker.<init>(BasicChecker.java:108) ~[na:na]
    ... 141 common frames omitted

在我的本地环境中测试相同的代码,只需使用Installcert.java 并使用 -Djavax.net.ssl.trustStore=jssecacerts 运行我的测试(jssecacerts 是由 InstallCert.java 生成的文件)。

【问题讨论】:

    标签: java security ssl https websphere


    【解决方案1】:

    感谢以上所有回复。能够解决问题 java.security.cert.CertPathValidatorException: Certificate chaining error with following configuration。

    1. 在 WebSphere 中发现以下 javax 属性返回空值。
      • javax.net.ssl.trustStore,
      • javax.net.ssl.trustStorePassword
      • javax.net.ssl.trustStoreType

    更多详情,请查看此链接,

    java - path to trustStore - set property doesn't work?

    1. 在 WebSphere 中配置如下属性

      选择服务器 > 应用程序服务器 > server_name > 进程定义 > Java 虚拟机 > 自定义属性 > 新建。

    a) javax.net.ssl.trustStore = jre_install_dir\lib\security\cacerts

    示例:C:\Program Files\WebSphere\AppServer\java\jre\lib\security\cacerts

    b) javax.net.ssl.trustStorePassword = changeit(默认)

    c) javax.net.ssl.trustStoreType = jks

    更多详情,请查看此链接,

    http://publib.boulder.ibm.com/infocenter/tivihelp/v2r1/index.jsp?topic=%2Fcom.ibm.isim.doc_6.0%2Finstalling%2Ftsk%2Ftsk_ic_ins_first_security_truststore.htm

    在配置能够在日志中看到证书被添加到信任存储之后。

    谢谢, 乌代尼莱卡

    【讨论】:

    • 谢谢 :) 这帮助很大 :)
    • 谢谢,这也是我的问题。我在 trust.p12 中拥有所有证书,但握手仍然失败。必须手动添加这些属性。
    【解决方案2】:

    我测试了一百万个 websphere 配置。

    唯一有效的程序是此链接中描述的程序:

    http://blog.xebia.com/2012/10/01/mutual-ssl-authentication-using-websphere-application-server-and-cxf/

    通过定义 cxf 拦截器:

    <cxf:bus>
     <cxf:outInterceptors>
       <bean class="---------------------.WebsphereSslOutInterceptor" />
    </cxf:outInterceptors>
    </cxf:bus>
    

    更多详情请看:

    https://github.com/vlussenburg/websphere-cxf-extensions#websphere-cxf-extensions

    非常感谢你们的帮助。

    【讨论】:

    • 第一个链接坏了:(
    【解决方案3】:

    您应该在配置中添加所有证书链。通常证书至少有授权中心的根证书或类似链的证书。

    默认情况下,WAS 需要签名证书。

    【讨论】:

    • 感谢您的回复,您能否提供更多解释。当我在本地环境中执行 Installcert 时,服务器会为我提供两个证书(根和叶),我将这两个证书导入 NodetrustedStore
    • 主要问题不同:您的证书是可信的还是自签名的?因为默认情况下 WAS 只需要 SSL 的可信证书。
    • 我的证书是可信的。不可能我已经看到这两个网址,这不能解决我的问题。无论我使用什么配置,我总是有同样的例外
    • 你见过这个解决方案吗:portal2portal.blogspot.com/2012/12/…
    【解决方案4】:

    这里的问题是证书路径构建器(Java Cert path API 的一部分)无法在 SSL 握手期间构建证书链。在握手期间,SSL 对等主机将其证书(身份)发送给客户端,为了让客户端信任该特定证书,必须在客户端建立信任链,这就是您遇到故障时发生的情况。这里的问题是无法创建信任链,因为您缺少信任库(信任锚)中的签名者证书和/或根证书。

    请注意,PKIX 信任管理器执行“信任范围”验证,这意味着您不需要客户端上的完整证书链来实现与 SSL 对等方的信任关系,您只需要签名者/中间证书在您的信任库中。事实上,如果您应该将叶子证书放在信任库中,那也应该可以正常工作,因为这表明您对该特定证书具有明确的信任,并且不需要证书链验证。

    【讨论】:

    • 能否请您详细说明如何导入叶证书?
    • 一种方法是从 Web 浏览器打开对等主机 (URL) 的位置,然后检查连接和用于该连接的对等证书,然后选择“保存到文件”来存储证书在您的本地计算机上。然后你可以使用一些工具,即 java 的 keytool 或 IBM 的 iKeyMan 将其导入本地密钥库。
    【解决方案5】:

    也许你应该看看下面的technote

    如果您处于某个修订包级别,您可以将值 com.ibm.websphere.ssl.retrieveLeafCert 设置为 true 并在 从端口检索

    【讨论】:

    • 我已经这样做了,我也添加了根证书和叶证书。我用 IkeyMan 探索证书内容的问题,当我尝试在我的 Local Env Outisde the websphere 中执行我的调用时,我发现与我的本地证书完全相同的内容
    【解决方案6】:

    以下是将证书导入 JVM 以进行 HTTPS WS 调用的步骤:

    A) 获取要导入的证书

    1. 每个浏览器都以不同的方式显示证书,但它们通常非常相似。在浏览器的 URL 栏上,通常有一个区域可供您单击以显示 SSL 证书信息。例如,您可能会在状态栏中看到一个挂锁,单击挂锁会打开证书信息。打开证书信息后,单击“证书路径”信息。通常会有一种方法来导出每个签名证书(受信任的根)。以 “Base-64 编码 X.509 (.CER)” 格式导出验证者。以这种格式导出的文件将是一个 ASCII 文本文件,在顶部和底部有“BEGIN CERTIFICATE”和“END CERTIFICATE”行。导出签署远程服务器 SSL 证书的证书后,您可以将它们导入 JVM。

    B) 导入证书

    1. 启动 ikeyman 实用程序。实用程序(ikeyman.bat 或 ikeyman.sh)位于 WAS_HOME\bin 中。
    2. 从密钥数据库文件菜单中,选择打开。
    3. 在密钥数据库类型中,选择 JKS。
    4. 在“文件名”字段中,键入 cacerts。
    5. 在位置字段中,输入 WAS_HOME\java\jre\lib\security。
    6. 在密码提示窗口中,在密码和确认密码窗口中键入密钥库的密码。默认密码是changeit。 点击确定。
    7. 将您为 LDAP 服务器创建的证书添加到此证书存储中。
    8. 在主窗口的密钥数据库内容区域中,从列表中选择签署者证书。 点击添加。
    9. 在“证书文件名”字段中,浏览并找到为 LDAP 服务器创建的服务器证书文件,该文件位于二进制 Der 数据中。验证适当的目录显示在位置字段中。 点击确定。
    10. 在提示中,键入此证书的标签。例如,键入 LDAPCA。 点击确定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-04
      • 2019-02-26
      • 2016-06-01
      • 2012-07-05
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 2019-05-20
      相关资源
      最近更新 更多