Aktualisieren von Anwendungsclientzertifikaten in Azure HorizonDB (Vorschau)

Wenn Sie Anwendungen mit Azure HorizonDB verbinden, muss der Anwendungsclient vertrauenswürdige Stammzertifikate installieren. Die folgenden Abschnitte führen Sie durch die Aktualisierung der vertrauenswürdigen Stammzertifikate für Anwendungen, bei denen es sich um ein gängiges Szenario für Anwendungen handelt, die eine Verbindung mit einer Azure HorizonDB-Instanz herstellen.

Importieren von Stammzertifikaten einer Zertifizierungsstelle in den Java-KeyStore im Client für Certificate-Pinning-Szenarien

Benutzerdefinierte Java-Anwendungen verwenden einen Standard-Keystore namens cacerts, der vertrauenswürdige Zertifizierungsstellenzertifikate(ZS-Zertifikate) enthält. Es wird auch häufig als Java-Vertrauensspeicher bezeichnet. Eine Zertifikatdatei mit dem Namen cacerts befindet sich im Verzeichnis für Sicherheitseigenschaften „java.home\lib\security“, wobei „java.home“ das Verzeichnis der Runtimeumgebung ist (das Verzeichnis „jre“ im SDK oder das Verzeichnis der obersten Ebene von Java™ 2 Runtime Environment). Sie können die folgenden Anweisungen verwenden, um Stamm-Zertifizierungsstellenzertifikate auf dem Client für Szenarien zum Anheften von Clientzertifikaten mit Azure Database for PostgreSQL zu aktualisieren:

  1. Überprüfen Sie den cacerts Java Keystore, um festzustellen, ob er bereits erforderliche Zertifikate enthält. Sie können Zertifikate im Java Keystore auflisten, indem Sie den folgenden Befehl verwenden:

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

    Wenn die erforderlichen Zertifikate im Java-Schlüsselspeicher auf dem Client nicht vorhanden sind, wie Sie in der Ausgabe überprüfen können, gehen Sie wie folgt vor:

  2. Erstellen Sie eine Sicherungskopie Ihres benutzerdefinierten Keystores.

  3. Laden Sie Zertifikate herunter und speichern Sie diese lokal, wo Sie darauf verweisen können.

  4. Generieren Sie einen kombinierten ZS-Zertifikatspeicher mit allen benötigten Stamm-Zertifizierungsstellenzertifikaten. Das folgende Beispiel zeigt die Verwendung von DefaultJavaSSLFactory für PostgreSQL-JDBC-Benutzer.

        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. Ersetzen Sie die ursprüngliche Keystore-Datei durch die neu generierte Datei:

    System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
    System.setProperty("javax.net.ssl.trustStorePassword","password");
    
  6. Ersetzen Sie die ursprüngliche PEM-Datei der Stammzertifizierungsstelle durch die kombinierte Datei der Stammzertifizierungsstelle, und starten Sie die Anwendung bzw. den Client neu.

    Weitere Informationen zum Konfigurieren von Clientzertifikaten mit dem PostgreSQL-JDBC-Treiber finden Sie in dieser Dokumentation.

    Note

    Um Zertifikate in Clientzertifikatspeicher zu importieren, müssen Sie möglicherweise CRT-Dateien für Zertifikate in das PEM-Format konvertieren. Sie können Transport Layer Security (TLS) in Azure HorizonDB (Preview) verwenden.

Programmgesteuertes Abrufen einer Liste vertrauenswürdiger Zertifikate im Java-Keystore

Standardmäßig speichert Java die vertrauenswürdigen Zertifikate in einer speziellen Datei namens cacerts, die sich im Java-Installationsordner auf dem Client befindet. Im folgenden Beispiel wird cacerts zuerst gelesen und dann in das KeyStore-Objekt geladen:

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;
}

Das Standardkennwort für cacerts ist changeit, sollte jedoch auf einem echten Client anders lauten, da Administrierende das Ändern des Kennworts unmittelbar nach der Java-Installation empfehlen. Nachdem das KeyStore-Objekt geladen wurde, können Sie die PKIXParameters-Klasse verwenden, um vorhandene Zertifikate zu lesen.

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());
}

Aktualisieren Sie die Stammzertifizierungsstellenzertifikate, wenn Sie Clients in Azure-App Services für Anheften von Zertifikaten-Szenarien verwenden.

Für Azure-App Services gibt es beim Herstellen einer Verbindung mit einer Azure HorizonDB-Instanz zwei mögliche Szenarien für die Aktualisierung von Clientzertifikaten, und dies hängt davon ab, wie Sie SSL mit Ihrer in Azure-App Services bereitgestellten Anwendung verwenden.

Aktualisieren Sie die Stammzertifizierungsstellenzertifikate, wenn Sie Clients in Azure Kubernetes Service (AKS) für Anheften von Zertifikaten-Szenarien verwenden.

Wenn Sie versuchen, mithilfe von Anwendungen, die in Azure Kubernetes Services (AKS) gehostet werden, eine Verbindung mit der Azure HorizonDB herzustellen und Zertifikate anzuheften, ähnelt es dem Zugriff von der Hostumgebung eines dedizierten Kunden. Die entsprechenden Schritte finden Sie hier.

Aktualisieren Sie die Stammzertifikate von Zertifizierungsstellen für .NET-Benutzer (Npgsql) unter Windows für Zertifikat-Pinning-Szenarien

Wenn Sie .NET (Npgsql) unter Windows für die Verbindung mit Azure HorizonDB verwenden, stellen Sie sicher, dass alle drei Zertifikate – Microsoft RSA Root Certificate Authority 2017, DigiCert Global Root G2 und DigiCert Global Root CA – im Windows-Zertifikatspeicher unter „Vertrauenswürdige Stammzertifizierungsstellen“ vorhanden sind. Ist eines der Zertifikate nicht vorhanden, importieren Sie das fehlende Zertifikat.

Aktualisieren Sie Stammzertifikate von Zertifizierungsstellen für andere Clients, für Szenarien mit Zertifikat-Anheftung

Für andere PostgreSQL-Clientbenutzer können Sie zwei Zertifizierungsstellenzertifikatdateien mit dem folgenden Format zusammenführen:

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