Как использовать клиентские сертификаты в клиентском Java-приложении? - PullRequest
0 голосов
/ 10 декабря 2018

Эта тема заняла у меня довольно много времени, чтобы понять.Есть разбросанные кусочки информации, и нужно все собрать воедино.Я надеялся, что с помощью этого поста я смогу помочь другим быстро собрать рабочее решение.


У меня есть файлы client-cert.pem, client-key.pem и root.pem, и мне нужно использовать их в моемJava-клиент для доступа к удаленному API REST.

Как упаковать их в склад доверенных сертификатов и использовать их для выполнения вызовов API?

1 Ответ

0 голосов
/ 10 декабря 2018

Чтобы загрузить сертификаты в ваше приложение, вам нужно будет упаковать их в склад доверенных сертификатов.

Создание хранилища доверенных сертификатов

с учетом 3 файлов:

  • client-cert.pem
  • client-key.pem
  • root.pem

Выполните следующие команды на своем терминале.Замените PASSWORD на нужный пароль.

  1. Упакуйте свой клиентский ключ и сертификат в хранилище ключей.Это создаст файл хранилища ключей PKCS12.

    openssl pkcs12 -export \
        -inkey client-key.pem -in client-cert.pem \
        -out client.pfx -passout pass:PASSWORD \
        -name qlikClient
    
  2. Добавьте хранилище ключей в хранилище доверенных сертификатов.Это создаст склад доверенных сертификатов, если пункт назначения не выйдет.Это создаст файл склада доверенных сертификатов PKCS12.По умолчанию он создает файл JKS, который является собственным форматом.Указав -deststoretype PKCS12, вы создадите файл в стандартном отраслевом формате.

    keytool -importkeystore \
        -destkeystore truststore.pfx -deststoretype PKCS12 -deststorepass PASSWORD \
        -srckeystore client.pfx -srcstorepass PASSWORD -srcstoretype PKCS12 \
        -alias qlikClient
    
  3. Добавьте свой корневой 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();

Ссылки

...