2016-06-17 2 views
-1

아파치 HttpClient를 4

그래서, 내가 그에 연결해야하는 서버가 이전, 사용되지 않는 인증서를 사용하고이 문제로되지 않는 SSL 암호화 방식 군에 대한 지원을 추가하는 방법. Apache HttpClient으로 연결을 시도하면 SSLException: Received fatal alert: close_notify이됩니다. 클라이언트 자체는 다른 서버에서 재사용 할 필요는 없지만 빌더 코드는이를 수행 할 수 있어야합니다.

내보다 적게보다는 이상적인 해결 방법은

나는 대체 TLS 프로토콜을 설정하여이 문제를 해결했다,하지만 또 다른 요청을 추가하기 때문에이 적합하지 않습니다. 이이보다 더 우아한 방법이어야합니다

URL url = new URL("https://..."); 
SSLContextBuilder sslContextBuilder = SSLContexts.custom(); 
try { 
    url.openConnection().connect(); 
} catch (SSLException e) { 
    sslContextBuilder.useProtocol("TLSv1"); 
} 

나는 또한 내가 또한 사용자 정의 SSLConnectionSocketFactory을 만드는 시도

을 시도했지만 TLSv1.2가 옵션으로 포함 된 경우 아파치는 TLSv1을 무시합니다. 본질적으로

SSLConnectionSocketFactory sf = new SSLConnectionSocketFactory(
     SSLContext.getDefault(), 
     new String[] { "TLSv1.2", "TLSv1" }, 
     null, 
     SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); 

반사

, 나는 기본 문제는 원격 서버가 사용되지 않는 암호화 제품군을 사용하는 것으로 가정합니다. SSLConnectionSocketFactory으로 지원하고자하는 모든 암호 스위트를 전달할 수는 있지만, 많은 것들이 있습니다. 그리고 Sun은 개인 클래스 뒤에 전체 목록을 숨겨 둡니다.

+0

가 해당 서버를 나열 할 수 있습니까? 예 : https://ex.qq.com/. ssllabs.com을 사용하여 지원하는 SSL 버전 및 암호 그룹을 확인할 수도 있습니다. – auntyellow

+0

당신의 마음을 확인하십시오. 더 이상 사용되지 않는 인증서 또는 사용되지 않는 암호 제품군입니까? – EJP

답변

1

$ JAVA_HOME/jre/lib/security/java.security에서 jdk.tls.disabledAlgorithms을 제거하여 더 이상 사용되지 않는 암호 수트 (예 : SSL_RSA_WITH_RC4_128_SHA)를 사용할 수 있습니다.

기본 HttpClient가 액세스하는 https://ex.qq.com/Received fatal alert: handshake_failure을 반환합니다. 그러나 다음과 같은 코드가 작동 할 수 있습니다

public static void main(String[] args) throws Exception { 
    HttpClientBuilder builder = HttpClientBuilder.create(). 
      setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContext.getDefault(), 
      new String[] {"TLSv1"}, new String[] {"SSL_RSA_WITH_RC4_128_SHA"}, new DefaultHostnameVerifier())); 
    try (CloseableHttpClient client = builder.build()) { 
     HttpGet get = new HttpGet("https://ex.qq.com/"); 
     System.out.println(client.execute(get).getStatusLine().getStatusCode()); 
    } 
} 

더 자세히이 질문을 참조 : Received fatal alert: handshake_failure through SSLHandshakeException

+0

JDK 설치를 수정하는 것이 제 경우에 좋은 해결책이되지 않을까 걱정됩니다. 이 응용 프로그램은 컨테이너 서비스에서 실행되므로 불가능하지는 않더라도 JDK를 수정하면 쉽게 훼손 될 수 있습니다. 당신의 다른 제안에 관해서는 그 하나의 프로토콜과 암호로만 작동하지 않을까요? 그것은 다른 프로토콜을 제대로 처리 할 것 같지 않습니다. – zalpha314

관련 문제