Ning Asynch HTTP-клиент, как принимать любые сертификаты

Я вижу на этой странице, как сделать https

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

но что, если я просто хочу игнорировать и принять любой сертификат, так как в этой среде мне сейчас наплевать на человека посередине, поскольку он находится в изолированной среде, и я просто делаю некоторые вещи для автоматического тестирования данных контроля качества.

Возможно, мой вопрос вместо этого состоит в том, как подделать SSL в стеке SSL Java, чтобы он принимал любой сертификат на другом конце (это не двунаправленный, так как это 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;

спасибо, Дин

1 ответ

5 лет опоздал на вечеринку, но я столкнулся с той же проблемой сегодня, и ваш вопрос поднялся довольно высоко в поиске Google. Так что, возможно, мой ответ поможет кому-то еще.

Принимая ваш код создания SSLContext, этот код создаст AsyncHttpClient, который будет игнорировать (или принимать вслепую) все сертификаты SSL:

    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;
    }

Приведенные выше примеры работают с Async HTTP Client 1.9.40 и Java 1.8

Другие вопросы по тегам