Обновление сертификатов клиента приложения в Azure HorizonDB (предварительная версия)

При подключении приложений к Azure HorizonDB клиент приложения должен установить доверенные корневые сертификаты. В следующих разделах описано обновление доверенных корневых сертификатов для приложений, что является общим сценарием для приложений, подключающихся к экземпляру HorizonDB Azure.

Импортируйте корневые сертификаты центра сертификации в хранилище ключей Java на стороне клиента для сценариев привязки сертификатов

Пользовательские приложения, написанные на Java, используют хранилище ключей по умолчанию, называемое cacerts, которое содержит сертификаты доверенных центров сертификации (ЦС). Он также часто называется хранилищем доверительных сертификатов Java. Файл сертификатов с именем cacerts находится в каталоге свойств безопасности java.home\lib\security, где java.home — каталог среды выполнения ( jre каталог в пакете SDK или каталог верхнего уровня среды выполнения Java™ 2). Для обновления корневых сертификатов ЦС клиента для сценариев пиннинга клиентских сертификатов с использованием PostgreSQL можно использовать следующие указания.

  1. Проверьте хранилище ключей cacerts Java, чтобы узнать, содержит ли он уже необходимые сертификаты. Вы можете перечислить сертификаты в хранилище ключей Java с помощью следующей команды:

      keytool -list -v -keystore ..\lib\security\cacerts > outputfile.txt
    

    Если необходимые сертификаты отсутствуют в хранилище ключей Java на стороне клиента, как видно из выходных данных, выполните следующие действия:

  2. Создайте резервную копию пользовательского хранилища ключей.

  3. Скачайте сертификаты и сохраните их локально, где можно ссылаться на них.

  4. Сгенерируйте объединенное хранилище сертификатов ЦС, включающее все необходимые сертификаты корневого ЦС. В приведенном ниже примере показано использование DefaultJavaSSLFactory для пользователей JDBC PostgreSQL.

        keytool -importcert -alias PostgreSQLServerCACert  -file D:\ DigiCertGlobalRootG2.crt.pem   -keystore truststore -storepass password -noprompt
    
        keytool -importcert -alias PostgreSQLServerCACert2  -file "D:\ Microsoft ECC Root Certificate Authority 2017.crt.pem" -keystore truststore -storepass password  -noprompt
    
        keytool -importcert -alias PostgreSQLServerCACert  -file D:\ DigiCertGlobalRootCA.crt.pem   -keystore truststore -storepass password -noprompt
    
  5. Замените исходный файл хранилища ключей новым созданным:

    System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
    System.setProperty("javax.net.ssl.trustStorePassword","password");
    
  6. Замените начальный pem-файл корневого ЦС на объединенный файл корневого ЦС и перезапустите ваше приложение или клиент.

    Дополнительные сведения о настройке сертификатов клиента с помощью драйвера JDBC PostgreSQL см. в этой документации.

    Note

    Чтобы импортировать сертификаты в хранилища сертификатов клиента, может потребоваться преобразовать файлы CRT сертификата в pem-формат. Вы можете использовать Transport Layer Security (TLS) в Azure HorizonDB (предварительная версия).

Получение списка доверенных сертификатов в Хранилище ключей Java программным способом

По умолчанию Java сохраняет доверенные сертификаты в специальном файле с именем cacerts , который находится в папке установки Java на клиенте. Пример ниже сначала считывает cacerts и загружает его в объект KeyStore :

private KeyStore loadKeyStore() {
    String relativeCacertsPath = "/lib/security/cacerts".replace("/", File.separator);
    String filename = System.getProperty("java.home") + relativeCacertsPath;
    FileInputStream is = new FileInputStream(filename);
    KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
    String password = "changeit";
    keystore.load(is, password.toCharArray());

    return keystore;
}

Пароль по умолчанию cacerts используется changeit , но должен отличаться в реальном клиенте, так как администраторы рекомендуют изменять пароль сразу после установки Java. После загрузки объекта KeyStore можно использовать класс PKIXParameters для чтения сертификатов.

public void whenLoadingCacertsKeyStore_thenCertificatesArePresent() {
    KeyStore keyStore = loadKeyStore();
    PKIXParameters params = new PKIXParameters(keyStore);
    Set<TrustAnchor> trustAnchors = params.getTrustAnchors();
    List<Certificate> certificates = trustAnchors.stream()
      .map(TrustAnchor::getTrustedCert)
      .collect(Collectors.toList());

    assertFalse(certificates.isEmpty());
}

Обновление сертификатов корневого центра сертификации при использовании клиентов в службах приложение Azure для сценариев закрепления сертификатов

Для приложение Azure Services при подключении к экземпляру Azure HorizonDB возможны два сценария обновления клиентских сертификатов, и выбор между ними зависит от того, как именно вы используете SSL в приложении, развернутом в приложение Azure Services.

Обновление сертификатов корневого удостоверяющего центра при использовании клиентов в Azure Kubernetes Service (AKS) для сценариев привязки сертификатов

Если вы пытаетесь подключиться к Azure HorizonDB из приложений, размещённых в Azure Kubernetes Service (AKS), с закреплением сертификатов, это аналогично доступу из выделенной хост-среды клиента. Ознакомьтесь с инструкциями по использованию TLS с контроллером входящего трафика в AKS.

Обновление сертификатов корневого центра сертификации для пользователей .NET (Npgsql) в Windows для сценариев закрепления сертификатов

Для пользователей .NET (Npgsql) в Windows, подключающихся к Azure HorizonDB, убедитесь, что все три сертификата — Microsoft RSA Root Certificate Authority 2017, DigiCert Global Root G2 и DigiCert Global Root CA — присутствуют в хранилище сертификатов Windows в разделе «Доверенные корневые центры сертификации». Если какие-либо сертификаты не существуют, импортируйте отсутствующий сертификат.

Обновление сертификатов корневого центра сертификации для других клиентов для сценариев закрепления сертификатов

Для других пользователей клиента PostgreSQL можно объединить два файла сертификата ЦС с помощью следующего формата:

-----BEGIN CERTIFICATE-----
(Root CA1: DigiCertGlobalRootCA.crt.pem)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Root CA2: Microsoft ECC Root Certificate Authority 2017.crt.pem)
-----END CERTIFICATE-----