2011-02-01 6 views
2

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

мне нужно каким-то образом установить параметры SSLSocket к WebConversation или WebRequest объекта; глядя на JavaDocs для HttpUnit, для этого нет такого метода или конструктора. Есть ли способ, которым я могу обернуть это внутри некоторого объекта, который обнаружил свойства SSLSocket?

ответ

1

Согласно this FAQ entry, кажется, что 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

Спасибо, так будет стандартный WebConversation.getResponse() вызов реализовать эту TrustManager? – TheWolf

+0

Я думаю, что тест необходим. Как сказано в этом вопросе, может потребоваться установить SSLFactory по умолчанию. Я редактирую свой ответ, чтобы предоставить другое решение/обходной путь. – Jcs

+1

java.security.KeyManagementException: по умолчанию SSLContext инициализируется автоматически –

2

что работал для меня, используя this tool, чтобы добавить недопустимый сертификат сервера в новое хранилище ключей (создает файл jssecacerts), а затем замените существующее хранилище ключей новым.
CP cacerts cacerts.bak Cp ~/инструменты/jssecacerts cacerts

HttpUnit работал отлично после этого.

1

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

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

Немного поздно, я только столкнулся с этим вопросом, но я сумел получить httpunit 1.7.2 работы с AnyTrustManager как в ответ Jsc «s со следующим кодом (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); 
    } 
} 
Смежные вопросы