2015-01-29 2 views
1

Я использую jersey-apache-client для подключения ssl. Я получаю сообщение об ошибке при попытке подтверждения соединения. Ниже приведена ошибка рукопожатия.SSL handshake_failure с использованием jersey-apache-client-1.18

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] 

код работает отлично, если я использую Джерси-клиент-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.13 не поддерживает прокси-сервер, я использовал Джерси-апачский-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(); 

Не удалось найти решение. В обоих случаях сертификаты все в порядке.

Примечание: Я также попробовал клиент apache jersey без прокси-сервера, но ошибка существует.

Неужели кто-нибудь находит, что пошло не так? Заранее спасибо.

ответ

0

Причина в том, что фабрика SSL-сокетов настраивалась для Джерси, однако вы используете соединитель Джерси-Apache, поэтому фабрику сокетов 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); 

Другой подвох, если вы используете абсолютный URI на Джерси WebResource (набор имя хоста и порт) в HostConfiguration с пользовательских SSLSocketFactory получите переопределен - и HttpClient будет по умолчанию с помощью виртуальной машины Java-х CA certs (правда для Apache Client 3.1).

Если вы раньше работали над этим, возможно, вы использовали сертификат, которому доверяют cacerts JVM. На самом деле здесь вы можете вручную добавить сертификат, который вы используете, в файл cacerts JVMs с помощью командной строки keytool (хотя для некоторых приложений это может быть неприемлемым решением).

0

В основном эта проблема возникает из-за несовпадающего шифрования между вашим локальным JAVA и сайтом https. Возможно, вам потребуется установить расширение JCE для JVM.

Используйте https://www.ssllabs.com/, чтобы проверить, если ваш REST API поддерживает Java, check this image example

Если это показывает, как это, вы можете загрузить файлы из http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html. Сделав это, замените два JAR (local_policy.jar, US_export_policy.jar) в директории lib/security JRE с теми из загруженного пакета.

Если нет, предоставьте более подробную информацию, чтобы мы могли проверить детали.

Проверьте решение здесь, я просто устал How to debug the ssl connection error, он работает для меня и сэкономит мой день!