web-dev-qa-db-ja.com

Websphereによって信頼されていない証明書

SOAP SSL .(https://zzzzzzzzzzzz/xxxxxで保護されたWebサービス)を呼び出すWebアプリケーションがあります。

サーバーは2つの証明書(ルートとリーフ)を送信するので、プロパティcom.ibm.websphere.ssl.retrieveLeafCertを使用して2つの証明書をインポートします。

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によって生成されたファイルです) 。

8
Nabil

100万個の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

助けてくれてありがとう。

3
Nabil

上記のすべての応答に感謝します。問題を解決できるJava.security.cert.CertPathValidatorException:Certificate chaining error with following configuration.

  1. 以下のjavaxプロパティがWebSphereでnull値を返すことがわかりました。
    • javax.net.ssl.trustStore、
    • javax.net.ssl.trustStorePassword
    • javax.net.ssl.trustStoreType

詳細については、このリンクをご覧ください。

Java-trustStoreへのパス-設定プロパティが機能しない?

  1. WebSphereで以下のようにプロパティを設定しました

    [サーバー]> [アプリケーションサーバー]> [サーバー名]> [プロセス定義]> 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

11
user3458628

たぶん、次の technote を見てください。

特定のフィックスパックレベルにいる場合は、値com.ibm.websphere.ssl.retrieveLeafCerttrueに設定し、 Port から取得しています。

0
trikelef

以下に、証明書を[〜#〜] jvm [〜#〜]にインポートする手順を示しますHTTPS WS call:

A)インポートする証明書を取得

  1. 各ブラウザーは証明書をさまざまな方法で表示しますが、通常は非常によく似ています。ブラウザのURLバーには、通常、クリックしてSSL証明書情報を表示できるゾーンがあります。たとえば、ステータスバーに南京錠が表示され、南京錠をクリックすると証明書情報が開きます。証明書情報が開いたら、「認証パス」情報をクリックします。通常、各署名証明書(信頼されたルート)をエクスポートする方法があります。 "Base-64 encoded 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です。 OKをクリックします。
  7. LDAPサーバー用に作成した証明書をこの証明書ストアに追加します。
  8. メインウィンドウの[キーデータベースコンテンツ]領域で、リストから[署名者証明書]を選択します。追加をクリックします。
  9. 「証明書ファイル名」フィールドで、LDAPサーバー用に作成されたサーバー証明書ファイルを参照して見つけます。これはBinary Derデータにあります。適切なディレクトリが[場所]フィールドに表示されていることを確認します。 OKをクリックします。
  10. プロンプトで、この証明書のラベルを入力します。たとえば、LDAPCAと入力します。 OKをクリックします。
0
edubriguenti

すべての証明書チェーンを構成に追加する必要があります。通常、証明書には、少なくとも認証センターのルート証明書またはチェーン類似の証明書があります。

WASでは、デフォルトで署名付き証明書が必要です。

0

ここでの問題は、証明書パスビルダー(Java Cert path API)の一部)がSSLハンドシェイク中に証明書チェーンを構築できないことです。ハンドシェイク中、SSLピアホストはその証明書(ID )クライアントに対して、クライアントがその特定の証明書を信頼するには、クライアント側で信頼のチェーンを構築する必要があります。障害が発生したときに何が起こっているのか。ここでの問題は、信頼のチェーンを作成できないことですトラストストア(トラストアンカー)に署名者証明書またはルート証明書、あるいはその両方がありません。

PKIXトラストマネージャーは「信頼の範囲」検証を実行することに注意してください。これは、SSLピアとの信頼関係を満たすためにクライアント側で完全な証明書チェーンを必要とせず、トラストストアに署名者/中間証明書のみが必要であることを意味します。実際、リーフストア証明書をトラストストアに配置する必要がある場合は、その特定の証明書に対する明示的な信頼があり、証明書チェーンの検証は必要ないことを示しているため、機能するはずです。

0
Robert Höglund