共用方式為


更新應用程式用戶端憑證

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

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

自定義撰寫的 Java 應用程式會使用預設金鑰存放區,稱為 cacerts,其中包含受信任的證書頒發機構單位 (CA) 憑證。 它通常也稱為 Java 信任存放區。 名為 cacerts 的憑證檔案位於安全性屬性目錄 java.home\lib\security 中,其中 java.home 是運行時間環境目錄( jre SDK 中的目錄或 Java™ 2 運行時間環境的最上層目錄)。 您可使用下列指示,透過 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;
}

的默認密碼 cacertschangeit ,但在實際用戶端上應該不同,因為系統管理員建議在 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 應用程式服務中使用用戶端時更新根 CA 憑證,以進行憑證關聯案例

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

在 Azure Kubernetes Service (AKS)中使用用戶端時更新根 CA 憑證,以進行憑證關聯案例

如果您嘗試使用裝載在 Azure Kubernetes Services (AKS) 中的應用程式來連線到適用於 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-----