Чтобы загрузить сертификаты в ваше приложение, вам нужно будет упаковать их в склад доверенных сертификатов.
Создание хранилища доверенных сертификатов
с учетом 3 файлов:
client-cert.pem
client-key.pem
root.pem
Выполните следующие команды на своем терминале.Замените PASSWORD
на нужный пароль.
Упакуйте свой клиентский ключ и сертификат в хранилище ключей.Это создаст файл хранилища ключей PKCS12.
openssl pkcs12 -export \
-inkey client-key.pem -in client-cert.pem \
-out client.pfx -passout pass:PASSWORD \
-name qlikClient
Добавьте хранилище ключей в хранилище доверенных сертификатов.Это создаст склад доверенных сертификатов, если пункт назначения не выйдет.Это создаст файл склада доверенных сертификатов PKCS12
.По умолчанию он создает файл JKS
, который является собственным форматом.Указав -deststoretype PKCS12
, вы создадите файл в стандартном отраслевом формате.
keytool -importkeystore \
-destkeystore truststore.pfx -deststoretype PKCS12 -deststorepass PASSWORD \
-srckeystore client.pfx -srcstorepass PASSWORD -srcstoretype PKCS12 \
-alias qlikClient
Добавьте свой корневой CA в хранилище доверенных сертификатов
keytool -importcert \
-keystore truststore.pfx -storepass PASSWORD \
-file root.pem -noprompt \
-alias qlikServerCACert
Обратите внимание, что в приведенных выше командах мы используем один и тот же PASSWORD
как для хранилища ключей, так и для хранилища доверенных сертификатов.В качестве альтернативы вы можете использовать разные пароли.Также обратите внимание, что вы должны указать псевдоним для каждого элемента, который вы добавляете в склад доверенных сертификатов.
Если вы хотите, чтобы ваше хранилище доверенных сертификатов доверяло всем доступным в вашей системе каскадам, добавьте параметр -trustcacerts
к шагу 2 или 3..
Вы можете использовать следующую команду для отображения содержимого вашего склада доверенных сертификатов
keytool -list -keystore truststore.pfx -storepass PASSWORD
Использование склада доверенных сертификатов в вашем приложении
После того, как вы получитеваше доверенное хранилище, вам нужно загрузить его в свое приложение.Предполагая, что у вас есть константа KEYSTORE_PATH
, содержащая путь к хранилищу доверенных сертификатов, и keyStorePass
, хранящая пароль, считайте файл хранилища доверенных сертификатов в KeyStore
private KeyStore readStore() {
try (InputStream keyStoreStream = new FileInputStream(KEYSTORE_PATH)) {
KeyStore keyStore = KeyStore.getInstance("PKCS12"); // or "JKS"
keyStore.load(keyStoreStream, keyStorePass.toCharArray());
return keyStore;
} catch (KeyStoreException | CertificateException | NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
Создайте пользовательский SSLContext
и пользовательский HttpClient
,
final KeyStore truststore = readStore();
final SSLContext sslContext;
try {
sslContext = SSLContexts.custom()
.loadTrustMaterial(truststore, new TrustAllStrategy())
.loadKeyMaterial(truststore, keyStorePass.toCharArray(), (aliases, socket) -> "qlikClient")
.build();
} catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException | UnrecoverableKeyException e) {
throw new RuntimeException("Failed to read keystore", e);
}
final CloseableHttpClient httpClient = HttpClients.custom().setSSLContext(sslContext).build();
Теперь вы можете использовать это HttpClient
для отправки запросов к вашему API.
HttpResponse response = httpClient.execute(new HttpGet("https://sense-gcp-central1eu.net:4242/qrs/app/full"));
Или, если вы используете OpenUnirest / unirest-java библиотека, вы можете настроить Unirest для использования ваших пользовательских HttpClient
Unirest.config().httpClient(httpClient);
HttpResponse<JsonNode> response = Unirest.get("https://sense-gcp-central1eu.net:4242/qrs/app/full").asJson();
Ссылки