2009-05-06 16 views
7

セキュアな(つまりSSL)WebページからJavaコードを読み取ろうとしています。 URLConnection(java.net)とApacheのHTTPClientの両方を使用しようとしています。どちらの場合も 、私は要求を行うとき、私はこの例外を取得:javaのSSLサイトを認証できません: "pathLenConstraint違反 - 証明書パスの最後の証明書である必要があります。"

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIXパス検証に失敗しました: java.securityを。 cert.CertPathValidatorException: 基本的な制約がチェックに失敗しました: pathLenConstraintが違反 - この証明書 を com.sun.net.ssl.internal.ssl.Alerts.getSSLExceptionで 証明書パスの最後の証明書でなければなりません(Alerts.java:150 ) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSock etImpl.java:1518) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessageでcom.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:848) ( でHandshaker.java:168) (Handshaker.java:495) at com.sun.net.ssl.internal.ssl.Handshaker.process_record Handshaker.java:433) at com.sun.net.ssl.internal.ssl.SSLSocketIm com.sun.net.ssl.internal.sslでpl.readRecord(SSLSocketImpl.java:818) でcom.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030) 。 sun.net.www.protocol.https.HttpsClientでSSLSocketImpl.startHandshake(SSLSocketImpl.java:1057) でcom.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1041) 。 でafterConnect(HttpsClient.java:402) でsun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnectionの。 java:934) sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStreamで(HttpsURLConnectionImpl.java:234) でcom.sap.river.coghead.rest.Main.testJavaHTTPConnection(Main.java:45) におけるCOM sun.security.validator.ValidatorException: PKIXパス検証が失敗しました: java.security.cert.CertPathValidatorException: 基本制約.sap.river.coghead.rest.Main.main(Main.java:32) によって引き起こされますチェックが失敗しました: pathLenConstraint違反 - この証明書 は 認証パスの最後の証明書である必要があります sun.security.validator.PKIXValidator.doValidate(PKIXValida tor.java:187) でsun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:139) でsun.security.validator.Validator.validate(Validator.java:203) はcom.sunで.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172) ( )com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl。Javaの: java.security.cert.CertPathValidatorException: 基本的な制約320) でcom.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841) ... 13もっとによって引き起こされますチェックに失敗しました: pathLenConstraintが違反 - この証明書 sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:139)で 証明書パス内の最後の証明書でなければなりません を sun.security.provider.certpathでパラメータ: PathValidator.java:178) でjava.security.cert.CertPathValidator.validate(CertPathValidator.java:206) でsun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:182) ... 18以上

私は別のホストへの非SSL接続を確立することに成功したことに注意してください。 ブラウザを使用してこのページを表示することもできます。証明書はそこで正しく検証されます。

証明書をサーバーから取得する際に、証明書の順序を何とか変更する必要がありますか。 いくつかの設定がありますか?事前に

おかげで、

LIOR

答えて

6

私はさらにに掘らと答えは、私はSSLを認証するためにJVMが使用するキーストアに必要な証明書をインポートするために必要なことです。 キーストアは、プログラムを実行するために使用されるjreのlib/security/jreフォルダの下にある 'cacerts'ファイルです。

手動でサイトの証明書をエクスポートしました。
次に、Sunが提供する 'keytool'ユーティリティを使用して、それをデフォルトのキーストアにインポートしました。それらを正しい順序でインポートする必要があることに注意してください。
次に、JREの代わりに新しいキーストアを配置しました。

JREのキーストアに証明書を直接インポートする方が良いと思われますが、このツールは私にはわからないパスワードを求めました。

私はこれをもっと簡単にプログラムする方法もあると信じていますが、まだ見つけられていません。私はいくつかのポインタ(JSSEのTrustManagerクラス?)を取得することができます。

最後に、いくつかのクレジットこの投稿はhttp://javaishdiscoveries.blogspot.com/2009/02/battle-with-cacerts-and-https.htmlが私を正しい方向に向けるのに役立ちました。

+0

役立ちましたこのことができますかどうかは知りませんが、JavaはデフォルトのSLLSocketFactoryを変更することができます。 – Powerlord

+0

はい、私はその地域で何かする必要があると思います。それだけをさらに調査する必要があります。 - Lior – Lior

+2

FYI、デフォルトのJava証明書キーストア$ JAVA_HOME/lib/security/cacertsのパスワードは「changeit」 –

0

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIXパスの検証に失敗しました:java.security.cert。するCertPathValidatorException:基本的な制約がチェックに失敗しました:pathLenConstraintが違反 - この証明書は、証明書パス内の最後の証明書でなければなりません

でpathLenConstraint

http://groups.google.com/group/google-checkout-developers-forum/web/google-checkout-and-ssl-certificates?version=49

に表示を(証明書チェーンについて注意してください) Googleは、証明書のチェーンオーダーに問題があるかもしれないと言います、私はちょうど私の証明書が順序ではなく、まだそれが動作していないことがわかりました。私は後でこれを更新します。


古いポスト:

はほとんど同じ問題を抱えています。

証明書をキーストアに追加すると便利ですが、私はクライアントとより自動的にやりたいと思っています。

だから私のソリューション:

私は 1.キーストアが存在していないだけで、この1つのアプリのためのキーストアを使用し、一つのホストます - 設定ファイルにパスワードを保存いくつか生成されたパスワード 2で作成 3.頼みますユーザーがこの証明書を受け入れるかどうかを指定します( )。そうなら、キーストアに保存し、必要に応じて使用します。

これは良い解決策ですか?コメントはありますか?

関連する問題