Проблемы HttpUnit WebConversation SSL - PullRequest
       6

Проблемы HttpUnit WebConversation SSL

2 голосов
/ 02 февраля 2011

Как можно игнорировать проблемы с сертификатами SSL из контекста объекта WebConversation или WebRequest? Я знаю, что могу создать подделку 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; Глядя на JavaDocs для HttpUnit, нет такого метода или конструктора для этого. Есть ли способ, которым я могу обернуть это в некоторый объект, который выставил свойства SSLSocket?

Ответы [ 5 ]

2 голосов
/ 02 апреля 2011

Для меня работало использование этого инструмента для добавления недействительного сертификата сервера в новое хранилище ключей (создает файл jssecacerts), а затем замена существующего хранилища ключей новым.
cp cacerts cacerts.bak cp ~ / tools / jssecacerts cacerts

HttpUnit работал нормально после этого.

1 голос
/ 25 февраля 2015

Если у вас есть доступ к WebClient, вы можете сделать это, чтобы пропустить проверку SSL-сертификата:

WebClient client = new WebClient();
client.getOptions().setUseInsecureSSL(true);
1 голос
/ 02 февраля 2011

Согласно этой записи часто задаваемых вопросов , похоже, что HttpUnit использует реализацию SSL, предоставленную стандартной библиотекой Java.Написание и установка «принять все» 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 не предоставляет никакого API для установки пользовательского SSLSocketFactry, здесь есть альтернативное решение, устанавливающее контекст 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 голосов
/ 23 апреля 2019

по состоянию на 2019 год, с оракулом 8 jvm на Mac и httpunit 1.7, ответ Jcs от 8 лет назад все еще очень близок, просто нужна еще одна строка.

    // 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;
    }
0 голосов
/ 13 октября 2015

Немного поздно, я только что столкнулся с этой проблемой, но мне удалось заставить httpunit 1.7.2 работать с AnyTrustManager согласно ответу 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);
    }
}
...