2

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

これが私が得ている例外です:

[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. 

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

4

5 に答える 5

2

私にとってうまくいったのは、このツールを使用してサーバーの無効な証明書を新しいキーストアに追加し (ファイル jssecacerts を作成)、既存のキーストアを新しいキーストアに置き換えることでした。
cp cacerts cacerts.bak cp ~/tools/jssecacerts cacerts

その後、HttpUnitは正常に機能しました。

于 2011-04-02T15:55:28.007 に答える
1

WebClient にアクセスできる場合は、これを実行して SSL 証明書の検証をスキップできます。

WebClient client = new WebClient();
client.getOptions().setUseInsecureSSL(true);
于 2015-02-24T21:35:32.463 に答える
1

この FAQ エントリによると、HttpUnit は Java 標準ライブラリが提供する SSL 実装を使用しているようです。「accept all」の作成とインストール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 を使用して接続を確立する場合)。

HttpUnit はカスタム SSLSocketFactry を設定するための API を提供していないように見えるため、ここではデフォルトの 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);
    }
}
于 2011-02-01T22:54:24.500 に答える
0

2019年現在、Macにoracle 8 jvmがあり、httpunit 1.7があり、8年前のJcsの回答はまだ非常に近く、もう1行必要です。

    // trust anything.
    static void setupSSL() {
        if(sslSetupDone) {
            return;
        }
        // System.setProperty("javax.net.debug", "ssl");

        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {              
                return null;
            }

            public void checkClientTrusted(X509Certificate[] certs, String authType) {              
            }

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

        } };

        SSLContext sc = null;
        try {
            sc = SSLContext.getInstance("TLS");  // formerly "ssl"
            sc.init(null, trustAllCerts, null);
            SSLContext.setDefault(sc);  //<====== one more line needed 
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

        javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            public boolean verify(String urlHostname, SSLSession sslSession) {
                return true;
            }
        });

        sslSetupDone = true;
    }
于 2019-04-23T00:03:06.450 に答える