您的客戶端應用程式與資料庫伺服器之間的連線始終使用業界標準的傳輸層安全(TLS),過去稱為安全套接層層(SSL)的加密技術。
備註
開源的 PostgreSQL 在其指令、變數和文件中使用舊名 SSL,以避免破壞現有實作。 本文使用 TLS 縮寫,但命令名稱和變數則使用 SSL。
Azure Database for PostgreSQL 支援使用 TLS 1.2 和 1.3 加密連線。 伺服器會拒絕所有嘗試加密流量的進來連線,並使用 TLS 1.0 和 TLS 1.1。
預設情況下,伺服器會強制客戶端與伺服器之間保持安全連線。 要停用此強制執行並允許加密與未加密的用戶端通訊,請將 require_secure_transport 伺服器參數改為 OFF。 你也可以透過設定 ssl_max_protocol_version 伺服器參數來設定 TLS 版本。
不要停用 TLS。
這很重要
Microsoft 開始為 Azure Database for PostgreSQL 進行 TLS 憑證輪替 ,以更新中間的 CA 憑證及其產生的憑證鏈。 根CA保持不變。
如果你的客戶端設定使用 TLS 的推薦配置,你就不需要採取任何行動。
證書輪替時間表
- Azure 地區(美國中西部、東亞及英國南部)於 2025 年 11 月 11 日開始 TLS 證書輪替。
- 自 2026 年 1 月 19 日起,此證書輪替計畫將擴展至剩餘(中國除外)區域,包括 Azure 政府。
- 2026 年春節 (農曆新年) 後,中國各個區域也將進行憑證輪替,包括對其中一個根 CA 的變更。
用戶端 TLS 設定
預設情況下,PostgreSQL 不會驗證伺服器憑證。 由於這種預設行為,用戶端無法偵測伺服器身份是否被偽造(例如有人修改 DNS 紀錄或接管伺服器 IP 位址)。 為防止此類偽裝,請在用戶端啟用 TLS 憑證驗證。
你可以為客戶端 TLS 設定設定許多連線參數。 其中幾個重要的例子包括:
ssl: 透過 TLS 連線。 這個房產不需要價值。 它的存在會指定一個 TLS 連線。 為了與未來版本相容,請使用值true。 在此模式下,當你建立 TLS 連線時,客戶端驅動程式會驗證伺服器身份,以防止中間人攻擊。sslmode:將此參數設為require:如果你需要加密,且如果無法加密,連線會失敗。 此設定確保伺服器被設定為接受該主機或 IP 位址的 TLS 連線,且伺服器能辨識用戶端憑證。 如果伺服器不接受 TLS 連線或客戶端憑證未被辨識,連線就會失敗。 下表列出此設定的值:sslmodeExplanation disable未使用加密。 Azure Database for PostgreSQL 需要 TLS 連線,所以不要使用這個設定。 allow如果伺服器設定需要或強制加密,則會使用加密。 Azure Database for PostgreSQL 需要 TLS 連線,因此此設定相當於 prefer。prefer如果伺服器設定允許加密,則會使用。 Azure Database for PostgreSQL 需要 TLS 連線。 require使用加密。 它確保伺服器已設定為接受 TLS 連線。 verify-ca使用加密。 將伺服器憑證與客戶端中儲存的受信任根憑證進行驗證。 verify-full使用加密。 請驗證伺服器憑證與客戶端儲存的憑證。 它也會驗證伺服器憑證是否使用與連線相同的主機名稱。 除非私有 DNS 解析器使用不同名稱來參考 PostgreSQL 伺服器的 Azure 資料庫,否則請使用此設定。
預設 sslmode 模式在基於 libpq的用戶端(例如 PSQL 和 JDBC)之間有所不同。 以 libpq 型用戶端預設為 prefer。
JDBC 用戶端預設為 verify-full。
-
sslcert、sslkey、 和sslrootcert:這些參數會覆蓋用戶端憑證、PKCS-8 用戶端金鑰及根憑證的預設位置。 它們分別預設為/defaultdir/postgresql.crt、/defaultdir/postgresql.pk8和/defaultdir/root.crt,其中在 Linux 系統上為defaultdir,在 Windows 上為${user.home}/.postgresql/。
這很重要
部分 Postgres 用戶端程式庫在使用 sslmode=verify-full 設定並搭配能夠交叉簽署中繼憑證的根 CA 憑證時,可能會無法連線。 此配置導致替代信任路徑。 在此情況下,明確指定參數。sslrootcert 或者,將 PGSSLROOTCERT 環境變數設定從預設值的 %APPDATA%\postgresql\root.crt 設定為本機路徑,其中放置了 Microsoft RSA Root CA 2017 根 CA 憑證。
安裝受信任的根憑證授權單位 (CA)
下載並轉換根 CA 憑證
對於使用 System 憑證儲存庫來存放受信任根憑證的 Windows 用戶端,無需操作,因為 Windows 會透過 Windows Update 部署新的根憑證。
對於 Java 用戶端、VS Code 擴充功能,以及不使用系統儲存的其他用戶端(例如 PSQLPerl),以及在 Linux 上運行的用戶端:你需要下載並合併根 CA 憑證成為一個 PEM 檔案。 至少應包含以下根 CA 憑證:
備註
針對中國區域及具有輪替展延的客戶:Digicert 全域根 CA (pem 檔案) 仍然有效;請將其包含在合併後的 PEM 檔案中。
納入所有 Azure 根 CA 憑證,如此一來,未來即使適用於 PostgreSQL 的 Azure 資料庫所使用的根 CA 有所變更,也能降低更新合併檔案的需求。 您可以在 Azure 憑證授權中心詳細資料中找到 Azure 根憑證清單。
要將憑證匯入用戶端憑證儲存,可能需要將任何 CRT 格式憑證轉換為 PEM 格式,並將 PEM 檔案串接成單一檔案。 你可以使用 OpenSSL X509 工具 將 CRT 檔案轉換成 PEM。
openssl x509 -inform DER -in certificate-filename.crt -out certificate-filename.pem -outform PEM
將根憑證合併成單一 PEM 檔案
對某些客戶端,你可以使用任何文字編輯器或命令列工具,將所有 PEM 檔案串接成一個檔案。
-----BEGIN CERTIFICATE-----
(Root CA1 content: DigiCertGlobalRootG2.crt.pem)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Root CA2 content: Microsoft ECC Root Certificate Authority 2017.crt.pem)
-----END CERTIFICATE-----
針對中國區域及具有輪替展延的客戶:
-----BEGIN CERTIFICATE-----
(Root CA0 content: DigiCertGlobalRootCA.crt.pem)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Root CA1 content: DigiCertGlobalRootG2.crt.pem)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Root CA2 content: Microsoft ECC Root Certificate Authority 2017.crt.pem)
-----END CERTIFICATE-----
為 Java 應用程式組合並更新根 CA 憑證
自訂 Java 應用程式使用一個預設的金鑰儲存庫, cacerts稱為 ,該金鑰庫包含受信任的憑證授權機構(CA)憑證。
cacerts憑證檔案位於安全屬性目錄java.home\lib\security中,該java.home處為執行環境目錄(jreSDK 中的目錄或 Java™ 2 執行環境的頂層目錄)。
若要更新 PostgreSQL 用戶端憑證關聯案例中所用的用戶端根 CA 憑證,請遵循以下指示:
檢查
cacertsJava 金鑰庫是否已經包含所需的憑證。 您可以使用以下指令在 Java 金鑰庫中列出憑證:keytool -list -v -keystore ..\lib\security\cacerts > outputfile.txt如果客戶端的 Java 金鑰庫中沒有必要的憑證(你可以在輸出中確認),請依照以下指示操作:
製作自訂金鑰存放區的備份複本。
下載憑證檔案,並存到本地以便查閱。
產生一個包含所有必要根憑證的合併CA憑證庫。 以下範例展示了 PostgreSQL Java 使用者使用 DefaultJavaSSLFactory 的做法。
keytool -importcert -alias PostgreSQLServerCACert -file "DigiCertGlobalRootG2.crt.pem" -keystore truststore -storepass password -noprompt keytool -importcert -alias PostgreSQLServerCACert2 -file "Microsoft ECC Root Certificate Authority 2017.crt.pem" -keystore truststore -storepass password -noprompt ...
更新 Azure 應用服務中的根 CA 憑證
當 Azure App Services 需連線至適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體時,更新用戶端憑證存在兩種可能案例。 這些情境取決於你在 Azure App Services 部署時如何使用 SSL。
- 在對您的 Azure Database for PostgreSQL 彈性伺服器實例進行變更之前,先在平台層級為 App Service 新增憑證。 如果您要在應用程式中使用 App Service 平台上所含的 SSL 憑證,則無需採取任何動作。 欲了解更多資訊,請參閱 Azure App Service 文件中的 「Add and Management TLS/SSL certificates in Azure App Service 」。
- 如果你在程式碼中明確包含 SSL 憑證檔案的路徑,你需要下載新的憑證並更新程式碼才能使用它。
在 Azure Kubernetes Service(AKS)中使用客戶端時,更新根 CA 憑證
如果你想透過 Azure Kubernetes Services(AKS)中託管的應用程式連接到 PostgreSQL 的 Azure 資料庫,這類似於從專用客戶的主機環境存取。 詳見 AKS文件中的詳細說明。
更新 Windows 上 .NET (Npgsql) 使用者的根 CA 憑證
對於在 Windows 上連接 Azure 資料庫以支援 PostgreSQL 彈性伺服器實例的 .NET (Npgsql) 使用者,請確保 所有 根憑證都包含在 Windows 憑證庫的受信任根憑證機構(Trusted Root Certification Authorities)中。 Windows Update 維護標準的 Azure 根 CA 清單。 如果推薦 設定 中沒有列出的憑證,請匯入缺少的憑證。
如何使用 TLS 進行憑證驗證
某些將 PostgreSQL 用於其資料庫服務的應用程式架構,在安裝期間預設不會啟用 TLS。 你的 Azure 資料庫用於 PostgreSQL 實例會強制執行 TLS 連線,但如果應用程式沒有設定 TLS,應用程式可能會失敗。 請參閱您的應用程式文件,以了解如何啟用 TLS 連線。
使用 PSQL 進行連接
以下範例展示了如何透過 PSQL 命令列介面連接你的伺服器。 使用 sslmode=verify-full or sslmode=verify-ca 連線字串設定來強制執行 TLS 憑證驗證。 將本機憑證檔案路徑傳遞至 sslrootcert 參數。
psql "sslmode=verify-full sslrootcert=<path-of-pem-file> host=mydemoserver.postgres.database.azure.com dbname=postgres user=myadmin"
測試 TLS 連線
在你嘗試從客戶端應用程式存取支援 TLS 的伺服器之前,請確保你能透過 PSQL。 如果你建立了 TLS 連線,應該會看到類似以下範例的輸出:
psql (14.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
你也可以載入 sslinfo 擴充功能 ,然後呼叫該 ssl_is_used() 函式來判斷是否使用 TLS。 如果連線使用 TLS,函式會回傳 t 。 否則會傳回 f。
以程式設計方式取得 Java 金鑰存放區中受信任的憑證清單
預設情況下,Java 會將受信任憑證儲存在一個名為 cacerts Java 的特殊檔案中,該檔案位於用戶端的 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());
}