2011-02-01 34 views
2

WebConversationまたはWebRequestオブジェクトのコンテキストからSSL証明書の問題を無視するにはどうすればよいですか?私はすべての証明書を受け入れる偽のTrustManagerを作成できますが、これをHttpUnitコンテキストでどのように設定することができますか?ここでHttpUnit WebConversation SSLの問題

は、私が取得しています例外です:

[Security:090508]Certificate chain received from my.domain.com - NUM.NUM.NUM.NUM was incomplete., 
[Security:090477]Certificate chain received from my.domain.com - NUM.NUM.NUM.NUM was not trusted causing SSL handshake failure. 

私は何とかWebConversationまたはWebRequestクラスのオブジェクトへのSSLSocket設定を設定する必要があります。 HttpUnitのJavaDocsにはそうするためのメソッドやコンストラクタはありません。 SSLSocketプロパティを公開しているオブジェクトの中にこれをラップする方法はありますか?

答えて

1

this FAQ entryによると、HttpUnitはJava標準ライブラリで提供されているSSL実装を使用しているようです。ライティングとTrustManagerを「すべてを受け入れる」をインストールは簡単です:

private static class AnyTrustManager implements X509TrustManager 
{ 
    public void checkClientTrusted(X509Certificate[] chain, String authType) 
    { 
    } 

    public void checkServerTrusted(X509Certificate[] chain, String authType) 
    { 
    } 

    public X509Certificate[] getAcceptedIssuers() 
    { 
     return new X509Certificate[0]; 
    } 
} 

static { 
    try { 
     SSLContext ssl = SSLContext.getInstance("SSL"); 
     ssl.init(null, new X509TrustManager[] {new AnyTrustManager()}, null); 
     HttpsURLConnection.setDefaultSSLSocketFactory(ssl.getSocketFactory()); 
    } catch (NoSuchAlgorithmException ex) { 
     throw new Error(ex); 
    } catch (KeyManagementException ex) { 
     throw new Error(ex); 
    } 
} 

ライブラリは、カスタムを使用して接続を確立している場合、このコードサンプルは、例えば(HttpUnitとで動作するようにいくつかの変更が必要な場合がありますことを心に留めておく必要がありますがのSocketFactory )

ここでカスタムSSLSocketFactryを設定するための任意のAPIを提供していませんHttpUnitとすると、デフォルトのSSLコンテキストを設定する代替ソリューション(Java 6の場合のみ)

static { 
    try { 
     SSLContext ssl = SSLContext.getDefault(); 
     ssl.init(null, new X509TrustManager[] {new AnyTrustManager()}, null); 
    } catch (NoSuchAlgorithmException ex) { 
     throw new Error(ex); 
    } catch (KeyManagementException ex) { 
     throw new Error(ex); 
    } 
} 
+0

おかげで、その標準WebConversation.getResponse()を呼び出すには、このTrustManagerのを実装するのだろうか? – TheWolf

+0

私はテストが必要と思う。上記のように、デフォルトのSSLFactoryを設定する必要があるかもしれません。私は私の応答を編集して、別の解決策/回避策を提供します。 – Jcs

+1

java.security.KeyManagementException:デフォルトのSSLContextが自動的に初期化される –

2

があるようですので、どのような私にとってはthis toolを使用してサーバーの無効な証明書を新しいキーストアに追加し(ファイルjssecacertsを作成)、既存のキーストアを新しいキーストアに置き換えました。
のCPのcacertsが CP〜/ツール/ jssecacertsのcacertsファイルをcacerts.bak

HttpUnitはその後うまく働きました。

1

あなたがWebクライアントへのアクセス権を持っている場合は、SSL証明書の検証をスキップするために、この操作を行うことができます。

WebClient client = new WebClient(); 
client.getOptions().setUseInsecureSSL(true); 
0

少し遅れて、私はちょうどこの問題に走ったが、しかし、私はAnyTrustManagerなどでの作業httpunit 1.7.2を得ることができました次のコードでJscの答えあたりに(HttpUnitとは、デ・フードの下でHttpsURLConnectionOldImplを使用しています):

static { 
    try { 
     SSLContext ssl = SSLContext.getInstance("TLS"); 
     ssl.init(null, new X509TrustManager[] {new AnyTrustManager()}, null); 
     com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl.setDefaultSSLSocketFactory(ssl.getSocketFactory());    
    } catch (NoSuchAlgorithmException ex) { 
     throw new Error(ex); 
    } catch (KeyManagementException ex) { 
     throw new Error(ex); 
    } 
}