2011-02-01 4 views
2

WebConversation 또는 WebRequest 개체의 컨텍스트에서 어떻게 SSL 인증서 문제를 무시할 수 있습니까? 모든 인증서를 수락하는 가짜 TrustManager을 만들 수 있지만 HttpUnit 컨텍스트에서 어떻게 설정할 수 있습니까? 여기 HttpUnit WebConversation SSL 문제

내가 점점 오전 예외 : 나는 어떻게 든 WebConversation 또는 WebRequest 클래스 객체에의 SSLSocket 설정을 설정해야

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

; HttpUnit 용 JavaDocs에는 그렇게 할 수있는 메소드 나 생성자가 없다. 이 SSLSocket 속성을 노출 된 일부 개체 안에이 래핑 할 수있는 방법이 있습니까?

답변

1

this FAQ entry에 따르면 HttpUnit은 Java 표준 라이브러리에서 제공하는 SSL 구현을 사용하는 것으로 보입니다. 쓰기와는 TrustManager을 "모두 동의 함"을 설치하면 간단하다 :이 코드 샘플은 HttpUnit은 함께 작동하도록 일부 수정해야 할 수도 있음을 유의하십시오 그러나

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

은 (예를 들어 라이브러리는 사용자 정의를 사용하여 연결을 설정하는 경우의 SocketFactory)

가 여기에 사용자 정의 SSLSocketFactry을 설정할 수있는 API를 제공하지 않습니다 HttpUnit은 것은 디폴트의 SSL 문맥을 설정 대체 솔루션 (자바 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 새 keystore (jssecacerts 파일을 만듭니다) 서버의 잘못된 인증서를 추가하는 데 사용하는 다음 새 키 스토어 내 바꿉니다.
의 CP 인 cacerts은

HttpUnit은 그 후에 괜찮 았는데/ 은 cp ~/도구를 cacerts.bak jssecacerts에의 인 cacerts.

1

당신은 웹 클라이언트에 액세스 할 수있는 경우는 SSL 인증서 유효성 검사 건너 뛰려면이 작업을 수행 할 수 있습니다

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

조금 늦게, 나는 단지이 문제에 실행을,하지만 난 AnyTrustManager 등의 작업 httpunit 1.7.2을 얻을 수 있었다 다음 코드로 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); 
    } 
}