使用適用於 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 證書:
- 檢查 cacerts Java 金鑰存放區,查看它是否已經包含必要的憑證。 您可使用下列命令,在 Java 金鑰存放區中列出憑證:
keytool -list -v -keystore ..\lib\security\cacerts > outputfile.txt
如果用戶端上的 java 金鑰存放區中沒有必要的憑證,您可以簽入輸出,您應該繼續進行下列指示:
製作自訂金鑰存放區的備份複本。
下載憑證,並將這些憑證儲存在本機,您可在其中參考這些憑證。
產生包含所有必要根 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
將原始金鑰存放區檔案換成新產生的檔案:
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file"); System.setProperty("javax.net.ssl.trustStorePassword","password");
將原始根 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-----