2013-08-28 1 views
0

Я пытаюсь ударить по удаленному серверу через вызов веб-службы get/post через SSL. Я использую апач HttpClient следующим образом:Как обойти веб-сервис по https, дающий ответ SSLHandshaking?

HttpClient client = new HttpClient(); 
client.getHostConfiguration().setProxy("my_host", 443); 
Credentials defaultcreds = new UsernamePasswordCredentials("dev", "password"); 
client.getState().setCredentials(new AuthScope("my_host", 443, AuthScope.ANY_REALM), defaultcreds); 

// Create a method instance. 
GetMethod method = new GetMethod(url); 

// Provide custom retry handler is necessary 
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
    new DefaultHttpMethodRetryHandler(3, false)); 

try { 
    // Execute the method. 
    int statusCode = client.executeMethod(method); 

if (statusCode != HttpStatus.SC_OK) { 
    System.err.println("Method failed: " + method.getStatusLine()); 
} 

    // Read the response body. 
    byte[] responseBody = method.getResponseBody(); 

// Deal with the response. 
// Use caution: ensure correct character encoding and is not binary data 
System.out.println(new String(responseBody)); 

} catch (HttpException e) { 
    System.err.println("Fatal protocol violation: " + e.getMessage()); 
e.printStackTrace(); 
} catch (IOException e) { 
    System.err.println("Fatal transport error: " + e.getMessage()); 
e.printStackTrace(); 
} finally { 
    // Release the connection. 
    method.releaseConnection(); 
} 

Это похоже на работу в ПЛАКАТЕ, но я знаю, что сертификаты находятся в браузере, и обрабатывает все аутентификации и сертификат обработку. Мне нужно написать код, чтобы этот ответ использовался в другом месте. Есть идеи? И будет ли это проблемой, когда код будет перенесен на сервер? (Будет ли нужен другой сертификат).

EDIT: вот дополнительная ошибка.

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
+0

Какое конкретное исключение SSLHandshakeException происходит? Отправьте стопку, пожалуйста. Кроме того, какой сертификат является хостом, с которым вы подключаетесь? Подписывается ли он крупным ЦС или подписывается ЦС? – Syon

+0

CA по своему выбору. Он не был добавлен в хранилище ключей, но я попытался обойти сертификат, поскольку он будет использоваться для целей тестирования. – worm

ответ

0

Правильный способ решения этой проблемы является добавление хостов CA к вашему JVMs (<jre directory>/lib/security/cacerts доверенных сертификатов). Вы можете получить сертификат ЦС, просмотрев URL-адрес хоста в браузере, просмотрев сертификат для сайта (обычно это делается, щелкая значок блокировки рядом с URL-адресом в браузере) и экспортируя ЦС в файл. Если у вас есть файл .crt, вы можете импортировать его в cacerts с помощью инструмента линии keytool команды:

keytool -keystore cacerts -importcert -alias someName -file yourCertFilename 

При запросе пароля по умолчанию является changeit

Если вы не хотите, чтобы добавить CA в доверительный магазин по умолчанию, вы можете создать свой собственный файл доверия, используя SSLSocketFactory, чтобы передать его HttpClient при его создании.

keytool -keystore myTrustStore.jks -importcert -alias someName -file yourCertFilename 

Введите пароль по вашему выбору при появлении соответствующего запроса.

KeyStore trustStore = KeyStore.getInstance("JKS"); 
trustStore.load(new FileInputStream("myTrustStore.jks"), trustStorePassword); 
SSLSocketFactory sf = new SSLSocketFactory(trustStore); 
Scheme httpsScheme = new Scheme("https", 443, sf); 
SchemeRegistry schemeRegistry = new SchemeRegistry(); 
schemeRegistry.register(httpsScheme); 
ClientConnectionManager cm = new SingleClientConnManager(schemeRegistry); 
HttpClient httpClient = new DefaultHttpClient(cm); 

(код выше от верхней части моей головы и не был проверен, но это должно дать вам идею.)

В качестве альтернативы, если вы хотите HTTPClient просто проверки сертификата обхода вообще (Я не рекомендую), вы можете создать TrustManager, который будет доверять любому сертификату like this.

+0

Спасибо большое! Я думаю, что просто хочу обойти сертификацию, а затем проверить, нужна ли аутентификация. Он будет использоваться только для тестирования. – worm