2014-01-24 226 views
7

我有一个Web应用程序调用通过SSL保护的SOAP Web服务。 (https://zzzzzzzzzzzz/xxxxx)。Websphere不信任的证书

服务器发送两个证书(Root和Leaf),因此我使用属性导入两个证书:com.ibm.websphere.ssl.retrieveLeafCert

在WebSphere启用SSL验证我只是添加证书到WebSphere:

SSL证书和密钥管理 - >密钥存储和证书 - >节点默认 - >签署者cerificates - >从端口检索:

  • 主机:主机名
  • 端口: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 

相同的代码在我的本地environement测试了使用简单的Installcert.java与-Djavax.net.ssl运行我的测试.trustStore = jssecacerts(jssecacerts是由InstallCert.java生成的文件)。

回答

3

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

这项工作的唯一方法就是在这个环节中描述的步骤:

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

通过定义CXF intercpter:

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

有关详细信息,请参阅:

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

非常感谢您的帮助。

+0

第一个链接已损坏:( –

0

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

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

+0

感谢您的回复,您能否提供更多的exaplanation。当我在我的本地环境中执行Installcert时,服务器向我呈现了两个证书(根和叶),我在NodetrustedStore中导入了两个证书 – Nabil

+0

你在给我推荐什么? – Nabil

+0

主要问题不同:您的证书是可信任的还是自签名的?因为默认情况下WAS仅需要SSL的可信证书。 –

0

此处的问题是,证书路径构建器(Java Cert路径API的一部分)无法在SSL握手期间构建证书链。在握手过程中,SSL对等主机将其证书(身份)发送到客户端,以便客户端相信该特定证书必须在客户端建立一个信任链,以便在发生故障时发生的情况。这里的问题是,由于缺少签署者证书和/或信任库中的根证书(信任锚),因此无法创建信任链。

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

+0

请你详细说明如何我可以导入叶证书吗? –

+0

一种方法是从Web浏览器打开对等主机(URL)的位置,然后检查连接和用于该连接的对等证书,并选择“保存到文件”以将证书存储在本地计算机上。然后,您可以使用一些工具,即Java的keytool或IBM的iKeyMan将其导入本地密钥库。 –

0

也许你应该看看下面的technote

如果你是在一个特定的修订包级别可以将该值com.ibm.websphere.ssl.retrieveLeafCert设置为,并从港口检索叶证书时

+0

我已经这样做了,我也添加了根证书和叶证书。我与IkeyMan探索证书的内容的问题,我发现exactelly与我的本地证书相同的内容,当我尝试执行我的电话在我的本地环境Outisde的websphere – Nabil

9

感谢上述所有答复。能够解决问题java.security.cert.CertPathValidatorException:具有以下配置的证书链接错误。

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

有关详细信息,请访问以下链接,

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

  • 在WebSphere

    中配置属性如下选择Servers> Application Servers> server_name> Process Definition> Java Virtual Machine> Custom Properties> New。

  • 一个)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

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

    感谢, 乌代Nilajkar

    +1

    谢谢:)这有助于很多:) –

    +0

    谢谢这是我的问题。我拥有trust.p12中的所有证书,但握手仍然失败。必须手动添加这些属性。 –

    0

    以下是导入到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. 在Location字段中,输入WAS_HOME \ java \ jre \ lib \ security。
    6. 在密码提示窗口中,在密码和确认密码窗口中键入密钥存储的密码。默认密码是changeit。 单击确定。
    7. 将您为LDAP服务器创建的证书添加到此证书存储中。
    8. 在主窗口的密钥数据库内容区域中,从列表中选择签署者证书。 点击添加。
    9. 在证书文件名字段中,浏览并找到为二进制数据中的LDAP服务器创建的服务器证书文件。验证相应的目录是否显示在位置字段中。 单击确定。
    10. 在提示中,键入此证书的标签。例如,键入LDAPCA。 单击确定。