2017-02-22 36 views
0

Я протестировал несколько синтаксических конструкций для Apache HttpClinet (HTTPS & TLS), чтобы игнорировать цепочку сертификатов для самоподписанных сертификатов, обычно используемых в конфигурациях «localhost». Существует настраиваемый HttpClient, который хорошо работает для TLSv1.1, но просматривая следы сервера, он не запускает использование TLSv1.2, который является желаемым алгоритмом безопасности.Как игнорировать «localhost» в Apache HttpClient с использованием TLSv1.2?

Ниже вы пытаетесь настроить HttpClient с помощью TLSv1.2.

Предложения по другим конструкциям приветствуются. Сценарий «localhost» остается обычным механизмом для разработки одноранговых подпрограмм. Было бы неплохо иметь настраиваемую процедуру, которая принимает самозаверяющие сертификаты только для доступа к localhost.

TLSv1.1 пример и с помощью пользовательских HttpClient (хорошо работает для TLSv1.1, но не работает для TLSv1.2):

HttpClient client = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()).setSslcontext(new SSLContextBuilder().loadTrustMaterial(null, (x509Certificates, s) -> true).build()).build(); 

Server Log:

*** Finished 
verify_data: { 251, 245, 220, 174, 235, 125, 248, 119, 220, 80, 38, 1 } 
*** 
Thread-7, WRITE: TLSv1 Handshake, length = 48 
%% Cached server session: [Session-23, SSL_ECDHE_RSA_WITH_AES_128_CBC_SHA] 
Thread-7, WRITE: TLSv1 Application Data, length = 108 
Thread-7, WRITE: TLSv1 Application Data, length = 1 
Thread-7, WRITE: TLSv1 Application Data, length = 19 

Клиент - ОК

Debug HTTP response: HttpResponseProxy{HTTP/1.1 200 OK [Date: Tue, 21 Feb 2017 21:16:02 GMT, Access-control-allow-origin: *, Content-length: 20] ResponseEntityProxy{[Content-Length: 20,Chunked: false]}} 
*** end of debug *** 
Service HTTP Response Code : 200 
contentLength is: 20 
serviceResponse : This is the response 

Тестирование с TLSv1.2 и код

SSLContext sslContext = SSLContexts.custom().build(); 
    SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, 
      new String[]{"TLSv1.2"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier()); 
    HttpClient client = HttpClients.custom().setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).setConnectionManager(clientConnectionManager).build(); 

класс (*) SSLContext осуждается

журнала сервера:

-Djavax.net.debug=ssl 
or 
System.setProperty("javax.net.debug", "ssl"); 

JsseJCE: Using MAC HmacSHA256 from provider TBD via init 
MAC: Using MessageDigest HmacSHA256 from provider IBMJCE version 1.8 
*** Finished 
verify_data: { 69, 241, 3, 42, 44, 222, 21, 174, 250, 83, 244, 25 } 
*** 
Thread-7, WRITE: TLSv1.2 Handshake, length = 80 
%% Cached server session: [Session-21, SSL_ECDHE_RSA_WITH_AES_128_CBC_SHA256] 
Thread-7, READ: TLSv1.2 Alert, length = 64 
Thread-7, RECV TLSv1.2 ALERT: warning, close_notify 

Ошибка на клиенте:

sh ./runit.sh 
javax.net.ssl.SSLPeerUnverifiedException: Host name 'localhost' does not match the certificate subject provided by the peer (CN=My Name, OU=RED, O=RED Brazil, L=MYCITY, ST=SP, C=BR) 

ответ

0

Следующая конструкция удалось соединиться с TLSv1.2 использованием местный сертификат:

// solution for localhost certificates and TLSv1.2 
// copied from: http://stackoverflow.com/questions/34655031/javax-net-ssl-sslpeerunverifiedexception-host-name-does-not-match-the-certifica/34657512 
// thanks 

     final SSLConnectionSocketFactory sslsf; 
     try { 
       sslsf = new SSLConnectionSocketFactory(SSLContext.getDefault(), 
        NoopHostnameVerifier.INSTANCE); 
     } catch (NoSuchAlgorithmException e) { 
      throw new RuntimeException(e); 
     } 

     final Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create() 
       .register("http", new PlainConnectionSocketFactory()) 
      .register("https", sslsf) 
      .build(); 

     // HttpClient client; 
     final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry); 
     cm.setMaxTotal(100); 
     HttpClient client = HttpClients.custom() 
       .setSSLSocketFactory(sslsf) 
       .setConnectionManager(cm) 
       .build(); 
     // end of solution for localhost bypass