Ich habe eine Webanwendung, die einen SOAP - Webdienst aufruft, der durch SSL gesichert ist .(https://zzzzzzzzzzzz/xxxxx
).
Der Server sendet zwei Zertifikate (Root und Leaf), also importiere ich das zwei Zertifikat mit der Eigenschaft: com.ibm.websphere.ssl.retrieveLeafCert
.
Um die SSL-Validierung in Websphere zu aktivieren, füge ich die Zertifikate einfach in Websphere hinzu:
Verwaltung von SSL-Zertifikaten und Schlüsseln -> Schlüsselspeicher und Zertifikat -> NodeDefaultTrustStore -> Signer-Zertifikate -> Von Port abrufen:
Das Problem ist, dass webshphere dem Zertifikat nicht vertraut und mir diesen Stacktrace gibt.
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
Derselbe Code wird in meiner lokalen Umgebung mit der einfachen Verwendung von Installcert.Java getestet und meine Tests werden mit -Djavax.net.ssl.trustStore = jssecacerts ausgeführt (jssecacerts ist die von InstallCert.Java erzeugte Datei).
Ich teste eine Million Websphere-Konfiguration.
Das einzige Verfahren, das funktioniert, ist das in diesem Link beschriebene Verfahren:
Durch die Definition des Cxf-Intercpter:
<cxf:bus>
<cxf:outInterceptors>
<bean class="---------------------.WebsphereSslOutInterceptor" />
</cxf:outInterceptors>
</cxf:bus>
Weitere Einzelheiten finden Sie unter:
https://github.com/vlussenburg/websphere-cxf-extensions#websphere-cxf-extensions
Vielen Dank für Ihre Hilfe, Jungs.
Vielen Dank für all die oben genannte Antwort. Kann das Problem Java.security.cert.CertPathValidatorException: Fehler bei der Zertifikatsverkettung mit der folgenden Konfiguration beheben.
Weitere Informationen finden Sie unter diesem Link.
Java - Pfad zu trustStore - Set - Eigenschaft funktioniert nicht?
Konfigurieren Sie die Eigenschaften wie unten in WebSphere angegeben
Wählen Sie Server> Anwendungsserver> Servername> Prozessdefinition> Java Virtual Machine> Benutzerdefinierte Eigenschaften> Neu.
a) javax.net.ssl.trustStore = jre_install_dir\lib\security\cacerts
Beispiel: C:\Programme\WebSphere\AppServer\Java\jre\lib\security\cacerts
b) javax.net.ssl.trustStorePassword = changeit (Standardeinstellung)
c) javax.net.ssl.trustStoreType = jks
Weitere Informationen finden Sie unter diesem Link.
Nachdem die Konfiguration in den Protokollen sehen konnte, dass Zertifikate zum Vertrauensspeicher hinzugefügt werden.
Danke, __. Uday Nilajkar
Vielleicht solltest du dir folgende technote anschauen.
Wenn Sie sich auf einem bestimmten Fixpack-Level befinden, können Sie den Wert com.ibm.websphere.ssl.retrieveLeafCert auf true setzen und das Blattzertifikat erhalten, wenn Abrufen von Port.
Führen Sie die folgenden Schritte aus, um ein Zertifikat in denJVMfür einen HTTPS WS-Aufruf zu importieren:
A) Erhalten Sie das zu importierende Zertifikat
B) Importiere das Zertifikat
Sie sollten alle Zertifikatsketten in Ihrer Konfiguration hinzufügen. Normalerweise hat das Zertifikat mindestens das Stammzertifikat des Authorization Centers oder kettenähnliche Zertifikate.
WAS erfordert standardmäßig ein signiertes Zertifikat.
Das Problem hierbei ist, dass der Zertifikatspfad-Generator (Ein Teil der Java Cert-Pfad-API) die Zertifikatskette während des SSL-Handshakes nicht erstellen kann. Während des Handshakes sendet der SSL-Peer-Host sein Zertifikat (Identität) an den Client. Damit der Client diesem bestimmten Zertifikat vertrauen kann, muss auf der Clientseite eine Vertrauenskette aufgebaut werden, die beim Auftreten des Fehlers geschieht. Das Problem hierbei ist, dass die Vertrauenskette nicht erstellt werden kann, da entweder das Unterzeichnerzertifikat und/oder das Stammzertifikat in Ihrem Truststore (Vertrauensanker) fehlt.
Beachten Sie, dass der PKIX-Trustmanager eine Gültigkeitsüberprüfung durchführt, was bedeutet, dass Sie keine vollständige Zertifikatskette auf der Clientseite benötigen, um die Vertrauensbeziehung mit dem SSL-Peer zu erfüllen. Sie benötigen nur die Unterzeichner/Zwischenzertifikate in Ihrem Truststore . Wenn Sie das Blattzertifikat im Truststore ablegen sollten, sollte dies auch funktionieren, da dies besagt, dass Sie explizit auf dieses bestimmte Zertifikat vertrauen und eine Zertifikatskettenvalidierung nicht erforderlich ist.