Мне нужно интегрировать приложение с внешним веб-сервисом, которое вынуждает использовать https. Авторы этого веб-сервиса предоставили мне файл .crt, который я должен использовать для создания https-запросов. После некоторого исследования я нашел следующий код, который использует класс KeyStore для безопасного доступа по протоколу HTTPS:с помощью KeyStore с .crt
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream instream = new FileInputStream(new File(file));
try {
trustStore.load(instream, password.toCharArray());
} finally {
instream.close();
}
SSLContext sslcontext =
SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();
SSLConnectionSocketFactory sslsf =
new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1.2"}, null,
BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
HttpClients.custom().setSSLSocketFactory(sslsf).build();
В этом коде KeyStore требует входного потока вместе с паролемtrustStore.load(instream, password.toCharArray())
;. Однако, как я понимаю, нам не нужен пароль при использовании .crt-файла. Поэтому этот способ загрузки сертификата мне не подходит. В то же время, из того, что я обнаружил до сих пор, приведенный здесь код является единственным способом настройки HttpClient для использования сертификата SSL. Существует ли какое-либо решение для настройки HttpClient для использования сертификата .crt?
Спасибо,
Андрей
Третьим вариантом является использование доверительного хранилища напрямую с API-интерфейсом клиента, что, по-видимому, выглядит как OP. Это лучше, чем любой из двух вариантов, которые вы изначально представляли, поскольку это не мешает никакому другому использованию хранилищ доверия. –
@ ChristopherSchultz Согласен, если OP хочет использовать оригинальное решение, конечно, конечно. Я предполагаю, что это зависит от варианта использования, если он распространяется по нескольким приложениям, может быть проще обновить глобальные cacerts. –