適用範圍:適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器
在用戶端上匯入 Java 金鑰存放區中的根 CA 憑證,以進行憑證關聯案例
自定義撰寫的 Java 應用程式會使用預設金鑰存放區,稱為 cacerts
,其中包含受信任的證書頒發機構單位 (CA) 憑證。 它通常也稱為 Java 信任存放區。 名為 cacerts
的憑證檔案位於安全性屬性目錄 java.home\lib\security 中,其中 java.home 是運行時間環境目錄( jre
SDK 中的目錄或 Java™ 2 運行時間環境的最上層目錄)。
您可使用下列指示,透過 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 應用程式服務中使用用戶端時更新根 CA 憑證,以進行憑證關聯案例
針對 Azure 應用程式服務,連線到適用於 PostgreSQL 的 Azure 資料庫彈性伺服器,我們可以有兩個更新用戶端憑證的可能案例,這取決於您如何搭配部署至 Azure App Services 的應用程式使用 SSL。
- 在適用於 PostgreSQL 的 Azure 資料庫彈性伺服器中發生變更之前,新的憑證會新增至 App Service 平台層級。 如果您使用應用程式 App Service 平臺中包含的 SSL 憑證,則不需要採取任何動作。 如需詳細資訊,請參閱 Azure App Service 檔中的新增和管理 Azure App Service 中的 TLS/SSL 憑證。
- 如果您明確在程式代碼中包含 SSL 憑證檔案的路徑,您必須下載新的憑證,並更新程式代碼以使用它。 此案例的良好範例是在 App Service 中使用自訂容器時,如在 Azure App Service 文件中的教學課程:在 Azure App Service 中設定自訂容器的側車容器所述。
在 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-----