Начнем с того, что я 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
. Все работает как хотелось.
У меня есть несколько вопросов.
- Как SSLProtocolSocketFactory разрешает ssl-сертификаты?
- Если я передаю sh эти изменения клиентам, как они настраивают сертификаты? Через веб-сервер или сервер приложений (WebSphere)?
- Целесообразно ли поддерживать
TLSv2
и TLSv1
в зависимости от настроек клиента? Если да, то как мне это проверить? (Я предполагаю отключить одну опцию за раз через IE и наоборот?)