2011-10-07 47 views
7

私はApache Commons HttpClientライブラリ(バージョン3.1)を入手しようとしていますが、サーバー証明書が(例外例外javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetのように)信頼できるものとして確立できないという事実を無視しています。Apache Commonsを作る方法HttpClient 3.1はHTTPS証明書の無効を無視しますか?

私はMake a connection to a HTTPS server from Java and ignore the validity of the security certificateなどDisable Certificate Validation in Java SSL Connectionsを見つけましたが、最初に受け入れ答えはHttpClientを4.0用です(残念ながら私はアップグレードすることはできません、ない限り、誰かが同じ2つの異なるバージョンを使用する方法の方向に私を指すことができます同じプロジェクト内のライブラリ)、another answer with little more than a dead link that supposedly went to a 3.x solutionがあります。 2番目のページのコードは、若干調整されたバージョン(基本的に、匿名のものをインラインで使用するのではなく、SSLに加えてTLSに適用するのではなく、古いファッションでクラスを宣言すると、このコード例のように、デフォルトのHTTPSソケットファクトリにはSSLを使用します)。

好ましくは、私はスレッド/インスタンス全体で何かをしたいと、そのように任意のHttpClientインスタンス(および/または関連クラス)私のサーブレットコード(ないで実行している別のサーブレット内からを作成していると思います同じコンテナ)はlax証明書検証ロジックを使用しますが、現時点では、自己署名証明書が有効である限り何かが実行されるように感じ始めています。

はい、私はセキュリティ上の意味があることを認識していますが、私がこれをまったく必要としない理由は、テスト目的のためです。通常、信頼できない証明書が信頼できるかどうかを制御する構成オプションを実装し、デフォルトで「信頼できないサーバー証明書を信頼しない」に設定します。こうすることで、開発中に簡単にオン/オフを切り替えることができますが、プロダクションでそれを行うには、自分の道を離れる必要があります。

答えて

11

自己署名証明書を受け入れるには、コモンズhttpクライアントの特定のHttpConnectionに対して次のコードを使用します。

HttpConnection con = new HttpConnection(host, port); 
con.setProtocol(new Protocol("easyhttps", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), port)); 

EasySSLProtocolSocketFactoryはcontrib sslパッケージにあります。これは、セキュリティ設定を減らした単一の接続だけを行うために使用できます。

Protocol easyhttps = new Protocol("https", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), 443); 
Protocol.registerProtocol("https", easyhttps); 

HttpClient client = new HttpClient(); 
GetMethod httpget = new GetMethod("https://localhost/"); 
client.executeMethod(httpget); 

しかし、私はそれはまた、他のサーブレットからの接続に影響を与えることになると思う: ここに示したように、これはまた、すべてのクライアントのためのプロトコルを設定するために使用することができるように思えます。

[編集] 申し訳ありませんが、これがうまくいくかどうかわかりません。ただ、私たちが3.1ではなくクライアント3.0.1を使用していることを認識しました。

+0

はい、3.1は、あなたが例示しているプロトコルコンストラクタを推奨しておらず、明らかにHttpConnection#setProtocolメソッドもありません。残念、それは有望に見えた。 :( –

+0

コンストラクタも3.0.1;で廃止されました)apacheソースリポジトリによると、 'HttpConnection'はまだ3.1の' setProtocol'メソッドを持っています:http://svn.apache.org/viewvc/httpcomponents/oac.hc3x /tags/HTTPCLIENT_3_1/src/java/org/apache/commons/httpclient/HttpConnection.java?view=markup – Gandalf

+0

工場は 'ProtocolSocketFactory'にキャストすることができます。これはアップキャストだけなので、廃止予定のコンストラクタを削除する場合は不要です、それから非推奨のコンストラクタを既に使用しています。私は自分の投稿を更新します。 – Gandalf

関連する問題