更新 Azure HorizonDB 中的應用程式用戶端憑證(預覽版)

當你將應用程式連接到 Azure HorizonDB 時,應用程式客戶端必須安裝受信任的根憑證。 以下章節將引導你如何更新應用程式的受信任根憑證,這是連接 Azure HorizonDB 實例的應用程式常見情境。

在用戶端的 Java 金鑰存放區中匯入根憑證授權單位憑證,以用於憑證釘選情境

自訂撰寫的 Java 應用程式會使用預設金鑰存放區 (稱為 cacerts),其中包含信任的憑證授權單位 (CA) 憑證。 它通常也稱為 Java 信任存放區。 名為 cacerts 的憑證檔案位於安全性屬性目錄 (java.home\lib\security),其中 java.home 是執行階段環境目錄 (SDK 中的 jre 目錄或 Java™ 2 Runtime Environment 的最上層目)。 您可以依照以下指示來更新用於 PostgreSQL 客戶端憑證釘選場景的客戶端根 CA 憑證:

  1. 檢查 cacerts Java 金鑰庫是否已經包含所需的憑證。 您可以使用以下指令在 Java 金鑰庫中列出憑證:

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

    如果客戶端的 Java 金鑰儲存庫中沒有必要的憑證(你可以在輸出中確認),請依照以下指示操作:

  2. 製作自訂金鑰存放區的備份複本。

  3. 下載憑證,並將其儲存在本機中以便參考。

  4. 產生包含所有必要根 CA 憑證的合併 CA 憑證存放區。 下列範例顯示針對 PostgreSQL JDBC 使用者使用 DefaultJavaSSLFactory。

        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. 將原始根 CA pem 檔案換成為合併的根 CA 檔案,然後重新啟動應用程式/用戶端。

    如需使用 PostgreSQL JDBC 驅動程式設定用戶端憑證的詳細資訊,請參閱此文件。

    Note

    若要將憑證匯入用戶端憑證存放區,您可能必須將憑證 .crt 檔案轉換成 .pem 格式。 你可以在 Azure HorizonDB(預覽版) 中使用傳輸層安全性(TLS)。

以程式設計方式取得 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 App Service 中的用戶端時,請更新根憑證授權單位憑證,以用於憑證釘選情境

對於連線至 Azure HorizonDB 執行個體的 Azure App Service,在更新用戶端憑證時,可能會有兩種情況,這取決於部署至 Azure App Service 的應用程式使用 SSL 的方式。

  • 在 Azure HorizonDB 實例發生變更之前,App Service 會在平台層級新增新的憑證。 如果您要在應用程式中使用 App Service 平台上所含的 SSL 憑證,則無需採取任何動作。 如需詳細資訊,請參閱 Azure App 服務 文件中的在 Azure App 服務 中新增和管理 TLS/SSL 憑證。
  • 如果您在程式碼中明確包含 SSL 憑證檔案的路徑,則必須下載新的憑證,並更新程式碼才能使用它。 此案例的良好範例是在 App Service 中使用自訂容器時,如在 Azure App 服務 文件中的教學課程:在 Azure App 服務 中設定自訂容器的側車容器所述。

在 Azure Kubernetes Service (AKS) 中使用用戶端時,請更新根憑證授權單位憑證,以用於憑證釘選情境

如果您嘗試使用託管於 Azure Kubernetes Service (AKS) 的應用程式,並採用憑證釘選來連線至 Azure HorizonDB,其方式類似於從專屬客戶的主機環境進行存取。 請參閱 AKS 上使用 TLS 與入口控制器的步驟。

針對 Windows 上的 .NET (Npgsql) 使用者,請更新根憑證授權單位憑證,以用於憑證釘選情境

對於使用 Windows 連接 Azure HorizonDB 的 .NET(Npgsql)使用者,請確保三個 Microsoft RSA 根憑證授權中心 2017、DigiCert Global Root G2 及 DigiCert Global Root CA 都存在於 Windows 憑證庫、受信任根憑證授權機構中。 如果沒有任何憑證,則請匯入遺漏的憑證。

針對其他用戶端,請更新根憑證授權單位憑證,以用於憑證釘選情境

對於其他 PostgreSQL 用戶端使用者,您可以使用下列格式來合併兩個 CA 憑證檔案:

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