簡體   English   中英

Websphere不信任的證書

[英]certificate not trusted by Websphere

我有一個Web應用程序調用通過SSL保護的SOAP Web服務。 (https://zzzzzzzzzzzz/xxxxx )。

服務器發送兩個證書(Root和Leaf),因此我使用以下屬性導入兩個證書: 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.cert.CertPathValidatorException:證書鏈接錯誤,具有以下配置。

  1. 發現以下javax屬性在WebSphere中返回null值。
    • javax.net.ssl.trustStore中,
    • javax.net.ssl.trustStorePassword中
    • javax.net.ssl.trustStoreType

有關詳細信息,請參閱此鏈接,

java - trustStore的路徑 - set屬性不起作用?

  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

配置后能夠在日志中看到要添加到信任庫的證書。

謝謝,Uday Nilajkar

我測試了一百萬個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

非常感謝您的幫助。

您應該在配置中添加所有證書鏈。 通常證書至少具有授權中心的根證書或鏈類似的證書。

WAS默認需要簽名證書。

這里的問題是證書路徑構建器(Java證書路徑API的一部分)無法在SSL握手期間構建證書鏈。 在握手期間,SSL對等主機將其證書(標識)發送到客戶端,以使客戶端信任必須在客戶端建立信任鏈的特定證書,即當您收到故障時發生的情況。 這里的問題是無法創建信任鏈,因為您缺少信任庫中的簽署者證書和/或根證書(信任錨)。

請注意,PKIX信任管理器執行“信任范圍”驗證,這意味着您不需要客戶端上的完整證書鏈來實現與SSL對等方的信任關系,您只需要信任庫中的簽名者/中間證書。 實際上,如果您應該將葉證書放在信任庫中,這也應該使事情有效,因為這表明您明確信任該特定證書並且不需要證書鏈驗證。

也許你應該看看下面的技術說明

如果您處於某個修訂包級別,則可以將值com.ibm.websphere.ssl.retrieveLeafCert設置為true,並在從端口檢索獲取葉證書。

以下是將證書導入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. 從Key Database File菜單中,選擇Open。
  3. 在密鑰數據庫類型中,選擇JKS。
  4. 在“文件名”字段中,鍵入cacerts。
  5. 在“位置”字段中,鍵入WAS_HOME \\ java \\ jre \\ lib \\ security。
  6. 在“密碼提示”窗口中,在“密碼”和“確認密碼”窗口中鍵入密鑰庫的密碼。 默認密碼為changeit。 單擊確定。
  7. 將為LDAP服務器創建的證書添加到此證書存儲中。
  8. 在主窗口的Key database content區域中,從列表中選擇Signer Certificates。 單擊添加。
  9. 在“證書文件名”字段中,瀏覽並找到為LDAP服務器創建的服務器證書文件,該文件位於二進制Der數據中。 驗證位置字段中是否顯示相應的目錄。 單擊確定。
  10. 在提示符下,鍵入此證書的標簽。 例如,鍵入LDAPCA。 單擊確定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM