2014-02-05 1 views
2

HttpsURLConnection을 사용하여 HTTPS 연결을 설정할 때 SSL 핸드 셰이크에 자체 인증서 확인 단계를 적용해야합니다. 호스트 인증서의 일부 속성을 확인하기 위해 자체 인증서 확인 코드를 작성했습니다. 인증서 해지 상태온라인 인증서 상태 프로토콜을 사용합니다. 이 단계를 Java에 포함시키는 올바른 방법은 무엇입니까? 다음과 같이 기본 HostNameVerifier의 일부로 추가 할 수 있지만이를 수행하는 적절한 방법이 있습니까?HTTPS에서 자체 인증서 확인 단계 수행 방법

HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
     HostnameVerifier verifier = HttpsURLConnection.getDefaultHostnameVerifier(); 
     public boolean verify(String s, SSLSession sslSession) { 
      return verifier.verify(s, sslSession) && MyVerifier.doMyVerification(sslSession); 
     } 
    }); 

답변

2

더 깨끗한 방법으로 나타냅니다. 독자적인 TrustManager를 사용해 커스텀 증명서 검증을 실시 할 수가 있습니다. 여기에 코드를 올바른 방법이 HostnameVerifierSSLSession에서 피어 인증서를 얻고 거기를 확인하는 것입니다

public class Test { 


public static void main(String [] args) throws Exception { 
    SSLContext ctx = SSLContext.getInstance("TLS"); 
    ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom()); 
    SSLContext.setDefault(ctx); 

    URL url = new URL("https://www.google.com"); 
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
    conn.setHostnameVerifier(new HostnameVerifier() { 
     public boolean verify(String arg0, SSLSession arg1) { 
      return true; 
     } 
    }); 
    System.out.println(conn.getResponseCode()); 
    conn.disconnect(); 
} 

private static class DefaultTrustManager implements X509TrustManager { 

    public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { 
    } 

    public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { 
     //Do certificate verification here and throw exception if invalid 
     throw new CertificateException(); 
    } 

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

} 
+1

'getAcceptedIssuers()'는 null을 반환 할 수 없으므로 안전하지 않습니다. checkClientTrusted()에서 아무것도하지 않는다. – EJP

+0

예, HostName을 확인하기 위해 true를 반환하는 것은 보안 적이 지 않으며 명백하다. 메소드를 구현하는 확실한 방법을 찾는 것은 개발자의 몫입니다. 질문은 "HTTPS에서 사용자 정의 인증서 확인 단계를 수행하는 방법"이며 checkServerTrusted (..) 메소드의 사용자 정의 TrustManager에 추가해야하며 HostNameVerifier에는 추가하지 말아야합니다. – Jeewantha

-1

이다.

+0

HostNameVerifier는 호스트의 HostName을 확인하고 거기에서 인증서 유효성 검사를하는 것이 부적절한 것입니다. -1 비 건설적인 응답. – Jeewantha

+0

부적절한 이유 – EJP

+1

@Jeeweentha 부적절한 이유 * 왜? * NB 나는 '비 건설적'이라는 의미를 찾으십시오. 그것은 당신이 생각하는 것처럼 보이는 것을 의미하지는 않습니다. – EJP