4

このページでhttpsの実行方法を確認します

http://sonatype.github.com/async-http-client/ssl.html

しかし、この環境のように証明書を無視して受け入れたい場合はどうなりますか?分離された環境にあり、QAデータの自動テストのためにいくつかの作業を行っているため、現在、中間者は気にしません。

代わりに私の質問は、JavaのSSLスタックでSSLを偽造して、もう一方の端で任意の証明書を受け入れる方法です(これは、httpsであるため双方向ではありません)。

上記のリンクにあるクライアントの一般的なコードは次のとおりです。

    char[] keyStorePassword = "changeit".toCharArray();
    KeyStore ks = KeyStore.getInstance("JKS");
    //ks.load(keyStoreStream, keyStorePassword);

    char[] certificatePassword = "changeit".toCharArray();
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    kmf.init(ks, certificatePassword);

    KeyManager[] keyManagers = kmf.getKeyManagers();
    javax.net.ssl.TrustManager tm = new MyTrustMgr();
    javax.net.ssl.TrustManager[] trustManagers = new javax.net.ssl.TrustManager[]{tm };
    SecureRandom secureRandom = new SecureRandom();

    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(keyManagers, trustManagers, secureRandom);
    return ctx;

さて、それをうまくやって、私はこれがまだ何らかの理由で機能していないことを知りました

    X509TrustManager tm = new X509TrustManager() {
        public void checkClientTrusted(X509Certificate[] xcs,
                String string) throws CertificateException {
        }
        public void checkServerTrusted(X509Certificate[] xcs,
                String string) throws CertificateException {
        }
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    };

    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(null, new TrustManager[] { tm }, null);
    return ctx;

ありがとう、ディーン

4

1 に答える 1

6

パーティーに 5 年遅れましたが、私は今日同じ問題に直面していて、Google 検索であなたの質問がかなり上位に上がりました。だから多分私の答えは他の誰かを助けるでしょう。

SSLContext を作成するコードを取得すると、このコードはすべての SSL 証明書を無視する (または盲目的に受け入れる) AsyncHttpClient を作成します。

    AsyncHttpClientConfig config = new AsyncHttpClientConfig.Builder()
            .setSSLContext(createSslContext())
            .build();

    httpClient = new AsyncHttpClient(config);

上記のように、 createSslContext メソッドは、回答にあるコードの正確なコピーと貼り付けです。

    private SSLContext createSslContext() throws Exception {
        X509TrustManager tm = new X509TrustManager() {

            public void checkClientTrusted(X509Certificate[] xcs,
                                       String string) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] xcs,
                                       String string) throws CertificateException {
            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };

        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(null, new TrustManager[] { tm }, null);
        return ctx;
    }

上記の例は、非同期 HTTP クライアント 1.9.40 および Java 1.8 で動作します。

于 2017-09-22T09:59:07.897 に答える