2015-01-29 3 views
1

ssl 연결에 jersey-apache-client를 사용하고 있습니다. 연결을 확인할 때 핸드 셰이크 오류가 발생합니다. 아래 핸드 셰이크 오류가 있습니다. 내가 저지 - 클라이언트 1.13를 사용하고 내가 악수 오류가 발생하지 않는 경우jersey-apache-client-1.18을 사용하는 SSL handshake_failure

WRITE: TLSv1 Change Cipher Spec, length = 1 
Finished 
verify_data: { 165, 117, 49, 237, 116, 71, 111, 175, 161, 237, 45, 30 } 
WRITE: TLSv1 Handshake, length = 48 
READ: TLSv1 Alert, length = 2 
RECV TLSv1 ALERT: fatal, handshake_failure 
%% Invalidated: [Session-1, TLS_DHE_RSA_WITH_AES_128_CBC_SHA] 

코드는 잘 작동합니다. 저지 - client.1.13 프록시를 지원하지 않기 때문에

SSLContext ctx = SSLContext.getInstance("TLS"); 
ctx.init(keyManagerFactory.getKeyManagers(), tmf.getTrustManagers(), null); 
final ClientConfig config = new DefaultClientConfig(); 
config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(null, ctx)); 
Client create = Client.create(config);  
create.resource(targetUrl).post(); 

, 나는 저지 - 아파치 - client.1.18을 사용했습니다. 아래 코드에서 DefaultApacheHttpClientConfig을 사용하고 프록시 지원을 추가했으며 ApacheHttpClient을 사용하여 클라이언트를 만들었습니다.

SSLContext ctx = SSLContext.getInstance("TLS"); 
ctx.init(keyManagerFactory.getKeyManagers(), tmf.getTrustManagers(), null); 
final DefaultApacheHttpClientConfig apacheConfig = new DefaultApacheHttpClientConfig(); 
final Map<String, Object> properties = apacheConfig.getProperties(); 
properties.put(DefaultApacheHttpClientConfig.PROPERTY_PROXY_URI, "http://" + proxyHost + ":" + proxyPort); 
properties.put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(null,ctx)); 
apacheConfig.getState().setProxyCredentials(AuthScope.ANY_REALM, proxyHost, Integer.parseInt(proxyPort),proxyUser, proxyPassword); 
Client create = ApacheHttpClient.create(apacheConfig); 
create.resource(targetUrl).post(); 

해결책을 찾을 수 없습니다. 두 가지 경우 모두 인증서가 괜찮습니다.

참고 : 프록시없이 저지 아파치 클라이언트를 시도했지만 여전히 오류가 있습니다.

무엇이 잘못되었는지 찾으십니까? 미리 감사드립니다.

답변

0

원인은 Jersey Apache 커넥터를 사용하고 있지만 SSL 소켓 팩토리가 Jersey 용으로 구성 되었기 때문에 SSL 소켓 팩토리가 Apache HttpClient에 직접 구성되어야합니다. 최신 버전의 Jersey (2.x)에서는이 작업이 완료 될 수 있지만 Apache 커넥터와 Jersey 1.x의 경우이 작업을 구성해야합니다. 이런 식으로 뭔가 :

Protocol apacheProtocol = new Protocol("https", socketFactory, 443); 
HostConfiguration hostConfig = new HostConfiguration(); 
hostConfig.setHost("your.hostname.org", 443, apacheProtocol); 
HttpClient httpClient = new HttpClient(); 
httpClient.setHostConfiguration(hostConfig); 
ApacheHttpClientHandler handler = new ApacheHttpClientHandler(httpClient); 
Client client = new ApacheHttpClient(handler); 

당신이 저지 WebResource (설정 호스트 이름 및 포트)의 SSLSocketFactory이 무시 얻을 것이다 사용자 정의와 HostConfiguration에 절대 URI를 사용하는 경우 여기에 또 다른 캐치입니다 - 그리고 HttpClient를가 기본값으로 사용됩니다 JVM의 CA certs (적어도 Apache Client 3.1의 경우).

이전에 제대로 작동했다면 JVM의 cacerts가 신뢰할 수있는 인증서를 사용했을 수 있습니다. 실제로 옵션은 명령 줄 keytool을 사용하여 사용중인 인증서를 JVM cacerts 파일에 수동으로 추가하는 것입니다 (그러나 일부 응용 프로그램의 경우이 방법이 수용 가능한 해결책이 아닐 수 있습니다).

0

기본적으로이 문제는 로컬 JAVA와 https 사이트 간의 불일치 암호 때문입니다. JVM 용 JCE 확장을 설치해야 할 수도 있습니다. 당신의 REST API는 자바를 지원하는 경우

사용 https://www.ssllabs.com/check this image example

는 다음과 같이 표시되면, 당신은 http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html에서 파일을 다운로드 할 수 있습니다, 확인합니다. 끝나면 JRE의 lib/security 디렉토리에있는 두 개의 JAR (local_policy.jar, US_export_policy.jar)을 다운로드 한 패키지의 lib/security 디렉토리로 대체하십시오.

그렇지 않은 경우 세부 정보를 제공하여 자세한 내용을 확인하십시오.

여기 솔루션을 확인하면 방금 How to debug the ssl connection error이 지쳐서 내게 도움이됩니다.

관련 문제