SSLProtocolSocketFactory против HttpClient через SSL - PullRequest
0 голосов
/ 06 февраля 2020

Начнем с того, что я SSL-новичок ie, поэтому извините, если эти вопросы окажутся слишком невежественными.

Я обновляю наше устаревшее java веб-приложение, написанное с использованием SSLProtocolSocketFactory, чтобы сделать HTTPS API-вызовы с использованием новых HttpClientBuilder и CloseableHttpClient. Одна вещь, которую я заметил, что httpclient требует, чтобы хранилище ключей было загружено явно через Java. В то время как я не вижу того же в устаревшем коде, использующем SSLProtocolSocketFactory. Я предполагаю, что это происходит за кулисами / чтение из cacerts?

 SSLProtocolSocketFactory f = new SSLProtocolSocketFactory();
 Socket s = f.createSocket(host,port);

 OutputStream out = s.getOutputStream();
 InputStream in = s.getInputStream() .....
 ByteArrayOutputStream  -- to read in the soap response

Новый код с использованием httpclient

KeyStore keyStore = KeyStore.getInstance("JKS");
FileInputStream instream = new FileInputStream(new File(
                    System.getProperty("javax.net.ssl.trustStore")));
        keyStore.load(instream,
                    System.getProperty("javax.net.ssl.trustStorePassword")
                            .toCharArray());
SSLContext  sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore,
                    System.getProperty("javax.net.ssl.trustStorePassword")
                            .toCharArray()).build();

HttpClientBuilder builder = HttpClientBuilder.create();
SSLConnectionSocketFactory sslConnectionFactory = new SSLConnectionSocketFactory(
                sslcontext, new String[]{"TLSv2","TLSv1"}, null,
                NoopHostnameVerifier.INSTANCE);

   builder.setSSLSocketFactory(sslConnectionFactory);

Я локально протестировал его в Tomcat8, так как у нас нет внешний сервер http настроил сервер. xml для чтения в хранилище ключей и импортировал сертификаты в java home/jre/bin/lib/security/cacerts. Начал установку jvm переменных env javax.net.ssl.trustStore и javax.net.ssl.trustStorePassword. Все работает как хотелось.

У меня есть несколько вопросов.

  1. Как SSLProtocolSocketFactory разрешает ssl-сертификаты?
  2. Если я передаю sh эти изменения клиентам, как они настраивают сертификаты? Через веб-сервер или сервер приложений (WebSphere)?
  3. Целесообразно ли поддерживать TLSv2 и TLSv1 в зависимости от настроек клиента? Если да, то как мне это проверить? (Я предполагаю отключить одну опцию за раз через IE и наоборот?)
...