共用方式為


使用適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器更新應用程式用戶端的用戶端 TLS 憑證

適用於: 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器

在用戶端上匯入 Java 金鑰存放區中的根 CA 憑證,以進行憑證釘選案例

自訂撰寫的 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 金鑰存放區中沒有必要的憑證,您可以簽入輸出,您應該繼續進行下列指示:

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

  2. 下載憑證,並將這些憑證儲存在本機,您可在其中參考這些憑證。

  3. 產生包含所有必要根 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
    
  4. 將原始金鑰存放區檔案換成新產生的檔案:

    System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
    System.setProperty("javax.net.ssl.trustStorePassword","password");
    
  5. 將原始根 CA pem 檔案換成為合併的根 CA 檔案,然後重新啟動應用程式/用戶端。

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

注意

若要將憑證匯入用戶端憑證存放區,您可能必須將憑證 .crt 檔案轉換成 .pem 格式。 您可使用 OpenSSL 公用程式進行這些檔案轉換

以程式設計方式取得 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 應用程式服務中的用戶端搭配適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器來更新根 CA 憑證

針對 Azure 應用程式服務,連線到適用於 PostgreSQL 的 Azure 資料庫,我們可有兩個可能案例來更新用戶端憑證,這取決於您如何使用 SSL 搭配已部署至 Azure 應用程式服務的應用程式。

  • 在適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器變更之前,新的憑證會新增至 App Service 平台層級。 如果您要在應用程式中使用 App Service 平台上所含的 SSL 憑證,則不需要採取任何動作。 如需詳細資訊,請參閱下列 Azure 應用程式服務文件
  • 如果您明確在程式碼中包含 SSL 憑證檔案的路徑,則必須下載新的憑證並更新程式碼,才能使用新的憑證。此案例的不錯範例是當您在 App Service 中使用 App Service 文件中所共用的自訂容器時

在憑證釘選案例中使用 Azure Kubernetes Service (AKS) 中的用戶端搭配適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器來更新根 CA 憑證

如果您嘗試使用在 Azure Kubernetes Services (AKS) 中裝載的應用程式連線到適用於 PostgreSQL 的 Azure 資料庫並釘選憑證,這就類似於從專用客戶主機環境進行存取。 請參閱這裡的步驟。

在憑證釘選案例中使用適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器來更新 Windows 上 .NET (Npgsql) 使用者的根 CA 憑證

針對 Windows 上的 .NET (Npgsql) 使用者,連線到適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器,確定三個 Microsoft RSA Root Certificate Authority 2017、DigiCert Global Root G2 以及 Digicert Global Root CA 全都存在於 Windows 證書存放區、信任的根憑證授權單位中。 如果沒有任何憑證,則請匯入遺漏的憑證。

在憑證釘選案例中更新其他用戶端的根 CA 憑證

至於其他 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-----