2016-12-29 9 views
0

Я использую apache.httpcomponent.httpcore и httpclient версии 4.3, я хочу использовать httpclient для отправки на мой https-сервер. Но когда я использую wirehark для улавливания пакета, пакет TCP не TLS. Может ли кто-нибудь сказать мне, почему?Apache httpclient с TLS, но не может поймать tls-пакет в wirehark

Следующий код: Я настраиваю SSLContext с помощью trustmanager. И я загружаю сертификат сервера в диспетчер доверия.

SSLContext ctx = null; 
String keystoreName = "/Users/user/ec_key/in_keystore"; 
char[] password = "123456".toCharArray();  //keystore's password 

    FileInputStream fIn; 
    KeyStore keystore; 
    TrustManagerFactory tmf=null; 

    try { 
     fIn = new FileInputStream(keystoreName); 
     keystore = KeyStore.getInstance("JKS"); 
     keystore.load(fIn, password);    //loading keysotre 

     tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); //TrustManagerFactory.getDefaultAlgorithm()=PKIX 
     tmf.init(keystore); 

     ctx = SSLContext.getInstance("TLSv1.2"); 
     // Initial SSLContext 
     ctx.init(null, tmf.getTrustManagers(), new java.security.SecureRandom()); 

     fIn.close(); 

    } catch (FileNotFoundException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (KeyStoreException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (CertificateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (KeyManagementException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

     // create SSLConnectionSocketFactory 
     SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(ctx); 

    CloseableHttpClient httpClient = HttpClientBuilder.create() 
      .setSSLSocketFactory(factory) 
      .disableAutomaticRetries() 
      .build(); 

//execute http method 
HttpResponse httpResponse = httpClient.execute(method); 

Я использую самоподписанный сертификат для сервера. И я использую

openssl s_client -connect 127.0.0.1:8443/webpage -CAfile test-ca.crt 

для подключения моего сервера. test-ca.crt - это сертификат для моего собственного центра сертификации. В результате проверяется, что код возврата равен 0 (ok). Поэтому мой сервер работает.

ответ

1

снят пакеты в порядке. Wireshark декодирует для отображения на основе (в основном) портов, используемых в качестве источника и/или адресата. Он знает, что некоторые стандартные порты, такие как 443 и 465, являются SSL/TLS, но он не знает 8443.

Правильно выберите пакет для этого сеанса в панели списка сообщений и выберите DecodeAs ... или выберите пакет и нажмите «Анализ»./DecodeAs .... и в версии 2 нажмите кнопку «+» (добавить); затем при необходимости отрегулируйте значение порта (до 8443), а в правом раскрывающемся списке (или в списке версии 1) выберите SSL.

+0

Спасибо @ dave_thompson_085! Оно работает! –