共用方式為


在 適用於 PostgreSQL 的 Azure 資料庫 中使用 TLS 和 SSL 保護連線 - 彈性伺服器

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

適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器會強制使用傳輸層安全性將用戶端應用程式連線到 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器。 TLS 是業界標準的通訊協定,可確保資料庫伺服器與用戶端應用程式之間的加密網路連線。 TLS 是安全套接字層 (SSL) 的更新通訊協定。

什麼是 TLS?

由 Netscape Communications Corp's 製造的 TLS。 安全套接字層會顯示並定期取代它,不過 SSL 或 SSL/TLS 一詞有時仍可互換使用。TLS 是由兩個層所組成: TLS 記錄顯示TLS 交握顯示。 記錄顯示提供關聯安全性,而交握顯示可讓伺服器和客戶互相確認,並在交易任何資訊之前協調加密評估和密碼編譯密鑰。

顯示一般 TLS 1.2 交握順序的圖表。

上圖顯示典型的 TLS 1.2 交握順序,包含下列各項:

  1. 用戶端一開始會傳送名為 ClientHello訊息,基本上表示願意透過 TLS 1.2 與一組加密套件用戶端支持通訊
  2. 伺服器會接收該訊息,並使用 ServerHello 同意使用特定加密套件透過TLS 1.2與客戶端通訊
  3. 以及伺服器傳送其金鑰共用。 此金鑰共用的詳細資料會根據選取的加密套件而變更。 要注意的重要詳細數據是,客戶端和伺服器必須同意密碼編譯密鑰,他們需要接收彼此的部分,或共用。
  4. 伺服器會傳送憑證(由 CA 簽署)和 ClientHello 和 ServerHello 部分的簽章,包括密鑰共用,讓用戶端知道這些憑證是真實的。
  5. 用戶端成功收到上述數據之後,然後產生自己的密鑰共用、將其與伺服器密鑰共用混合,進而產生會話的加密密鑰。
  6. 最後的步驟是,用戶端會傳送伺服器其密鑰共用、啟用加密並傳送 已完成 的訊息(這是到目前為止所發生之事的文字記錄哈希)。 伺服器執行相同的動作:它會混合密鑰共用以取得金鑰,並傳送自己的已完成訊息。
  7. 此時,應用程式數據可以在連線上加密。

憑證鏈結

憑證鏈結是一份已排序的憑證清單,其中包含SSL/TLS 憑證和證書頒發機構單位(CA)憑證,可讓接收者確認發件人和所有 CA 都值得信任。 鏈結或路徑會以 SSL/TLS 憑證開頭,而鏈結中的每個憑證都會由鏈結中下一個憑證所識別的實體簽署。 鏈結會以 根 CA 憑證終止。 跟 證書 CA 憑證 一律由證書頒發機構單位 (CA) 本身簽署。 鏈結中所有憑證的簽章必須驗證至根 CA 憑證。 鏈結中 SSL/TLS 憑證與根 CA 憑證之間的任何憑證稱為中繼憑證。

TLS 版本

全球有數個政府實體維護 TLS 的網路安全性指導方針,包括衛生與人類服務部(HHS)或國家標準技術研究所(NIST)在 美國。 TLS 所提供的安全性層級受到 TLS 通訊協定版本和支援的加密套件影響最大。 加密套件是一組演算法,包括加密、密鑰交換演算法和哈希演算法,可用來建立安全的 TLS 連線。 大部分的 TLS 用戶端和伺服器都支援多個替代方案,因此在建立安全連線以選取通用 TLS 版本和加密套件時必須交涉。

適用於 PostgreSQL 的 Azure 資料庫 支援 TLS 1.2 版和更新版本。 在 RFC 8996 中,因特網工程工作組(IETF)明確指出不得使用 TLS 1.0 和 TLS 1.1。 這兩種通訊協定已於 2019 年底淘汰。

默認會拒絕所有使用舊版 TLS 通訊協定的連入連線,例如 TLS 1.0 和 TLS 1.1。

注意

SSL 和 TLS 憑證會證明您的連線受到最先進的加密通訊協議保護。 藉由加密連線在網路,您可以防止在傳輸時未經授權存取您的數據。 這就是為什麼我們強烈建議使用最新版本的 TLS 來加密與 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器的連線。
雖然不建議這麼做,但如有需要,您可以選擇將require_secure_transport伺服器參數更新為 OFF,以停用 TLS\SSL 以連線到 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器。 您也可以設定ssl_min_protocol_versionssl_max_protocol_version伺服器參數來設定 TLS 版本。

憑證驗證是使用 SSL 用戶端憑證進行驗證。 在此案例中,PostgreSQL 伺服器會比較所顯示用戶端憑證的 CN(一般名稱)屬性與所要求的資料庫使用者。 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器目前不支援SSL憑證式驗證。

注意

適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器目前不支援自定義 SSL\TLS 憑證

若要判斷您目前的 TLS\SSL 連線狀態,您可以載入 sslinfo 擴充 功能,然後呼叫 函 ssl_is_used() 式來判斷是否使用 SSL。 如果連接使用 SSL,則函式會傳回 t,否則會傳回 f。 您也可以使用下列查詢,收集 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例 SSL 使用量的所有資訊:

SELECT datname as "Database name", usename as "User name", ssl, client_addr, application_name, backend_type
   FROM pg_stat_ssl
   JOIN pg_stat_activity
   ON pg_stat_ssl.pid = pg_stat_activity.pid
   ORDER BY ssl;

若要進行測試,您也可以直接使用 openssl 命令,例如:

openssl s_client -connect localhost:5432 -starttls postgres

此命令會列印許多低階通訊協議資訊,包括 TLS 版本、加密等等。 您必須使用 -starttls postgres 選項,否則此命令會報告未使用 SSL。 使用此命令至少需要 OpenSSL 1.1.1。

注意

若要強制執行最新、最安全的 TLS 版本,以便從用戶端連線到 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器,ssl_min_protocol_version設定1.3這需要連線到您 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例的用戶端,才能使用此版本的通訊協定安全地通訊。 不過,較舊的用戶端不支援此版本,因此可能無法與伺服器通訊。

在客戶端上設定 SSL

根據預設,PostgreSQL 不會執行伺服器證書的任何驗證。 這表示可以詐騙伺服器身分識別(例如修改 DNS 記錄或接管伺服器 IP 位址),而不需要用戶端知道。 所有 SSL 選項都會以加密和金鑰交換的形式帶來額外負荷,因此必須在效能和安全性之間做出取捨。 若要防止詐騙,必須使用用戶端上的SSL憑證驗證。 設定 SSL 的用戶端有許多連線參數。 我們很少有重要事項:

  1. ssl。 使用 SSL 連線。 此屬性不需要與其相關聯的值。 它的存在只會指定 SSL 連線。 不過,為了與未來的版本相容,建議使用 「true」 值。 在此模式中,建立 SSL 連線時,用戶端驅動程式會驗證伺服器的身分識別,以防止「中間人」攻擊。 它會藉由檢查伺服器證書是否由信任的授權單位簽署,而您要連線的主機與憑證中的主機名相同,即可執行此動作。
  2. sslmode。 如果您需要加密,而且如果無法加密連線,則請設定 sslmode=require。 這可確保伺服器已設定為接受此主機/IP 位址的SSL連線,而且伺服器可辨識客戶端憑證。 換句話說,如果伺服器不接受SSL連線,或無法辨識客戶端憑證,連線將會失敗。 下表列出此設定的值:
SSL 模式 說明
disable 未使用加密
允許 如果 f 伺服器設定需要\強制加密,則會使用加密
喜歡 如果伺服器設定允許加密,則會使用加密
需要 使用加密。 這可確保伺服器已設定為接受此主機 IP 位址的 SSL 連線,而且伺服器可辨識客戶端憑證。
verify-ca 使用加密。 此外,針對用戶端上儲存的憑證驗證伺服器證書簽章
verify-full 使用加密。 此外,針對用戶端上儲存的憑證驗證伺服器證書簽章和主機名

使用的預設 sslmode 模式在 libpq 型用戶端 (例如 psql) 和 JDBC 之間不同。 以 libpq 為基礎的用戶端預設為 偏好,而 JDBC 用戶端預設為 驗證完整

  1. sslcertsslkeysslrootcert。 這些參數可以覆寫用戶端憑證的預設位置、PKCS-8 用戶端密鑰和跟證書。 這些默認分別為 /defaultdir/postgresql.crt、/defaultdir/postgresql.pk8 和 /defaultdir/root.crt,其中 defaultdir 為 ${user.home}/.postgresql/ 的 *nix 系統和 windows 上的 %appdata%/postgresql/ 。

證書頒發機構單位(CA) 是負責頒發證書的機構。 受信任的證書頒發機構單位是有權驗證某人的實體,他們說自己是誰。 為了讓此模型能夠運作,所有參與者都必須同意一組受信任的CA。 所有操作系統和大部分的網頁瀏覽器都會隨附一組受信任的 CA。

注意

使用 verify-ca 和 verify-full sslmode 組態設定也稱為憑證釘選 在此情況下,PostgreSQL 伺服器上的根 CA 憑證必須比對憑證簽章,甚至是用戶端上的憑證主機名。 請務必記住,當證書頒發機構單位在PostgreSQL伺服器憑證上變更或過期時,您可能需要定期更新用戶端儲存的憑證。 若要判斷您是否要釘選 CA,請參閱 憑證釘選和 Azure 服務

如需用戶端上SSL\TLS 設定的詳細資訊,請參閱 PostgreSQL檔

注意

對於使用 verify-caverify-full sslmode 組態設定的用戶端,也就是憑證釘選,他們必須接受 兩個 根 CA 憑證:

在憑證釘選案例中下載根 CA 憑證和更新應用程式用戶端

若要在憑證釘選案例中更新用戶端應用程式,您可以從下列 URI 下載憑證:

若要將憑證匯入用戶端證書存儲,您可能需要 將憑證 .crt 檔案轉換成 .pem 格式,才能從上述 URI 下載憑證檔案。 您可以使用 OpenSSL 公用程式來執行這些檔案轉換,如下列範例所示:

openssl x509 -in certificate.crt -out certificate.pem -outform PEM

使用新的根 CA 憑證更新用戶端應用程式證書存儲的詳細資訊已記載於本 操作說明檔中

重要

某些 Postgres 用戶端連結庫在使用 sslmode=verify-full 設定時,可能會遇到使用中繼憑證交叉簽署的根 CA 憑證聯機失敗,導致替代信任路徑。 在此情況下,其建議會明確指定 上述的 sslrootcert 參數,或將 PGSSLROOTCERT 環境變數設定為 Microsoft RSA 跟證書授權單位 2017 根 CA 憑證的本機路徑,從 預設值 %APPDATA%\postgresql\root.crt

讀取具有憑證釘選案例的複本

透過根 CA 移轉至 Microsoft RSA 跟證書授權單位 2017 ,新建立的複本在比稍早建立的主伺服器還新的根 CA 憑證上是可行的。 因此,對於使用 verify-caverify-full sslmode 組態設定的用戶端,也就是憑證釘選,對於中斷聯機以接受 這兩個 根 CA 憑證而言,勢在必行:

注意

適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器目前不支援憑證式驗證

在憑證釘選案例中使用 psql 連線來測試客戶端憑證

您可以從用戶端使用 psql 命令行,在憑證釘選案例中測試伺服器的連線能力,如下列範例所示:


$ psql "host=hostname.postgres.database.azure.com port=5432 user=myuser dbname=mydatabase sslmode=verify-full sslcert=client.crt sslkey=client.key sslrootcert=ca.crt"

如需ssl和憑證參數的詳細資訊,您可以遵循 psql 檔。

測試 SSL/TLS 連線 ivity

嘗試從用戶端應用程式存取已啟用 SSL 的伺服器之前,請確定您可以透過 psql 取得它。 如果您建立了 SSL 連線,您應該會看到類似下列的輸出。

psql (14.5)SSL 連線(通訊協定:TLSv1.2,加密:ECDHE-RSA-AES256-GCM-SHA384,位:256,壓縮:關閉)輸入「說明」以取得協助。

您也可以載入 sslinfo 擴充功能,然後呼叫 ssl_is_used() 函式來判斷是否使用 SSL。 如果連接使用 SSL,則函式會傳回 t,否則會傳回 f。

加密套件

密碼套件 是一組加密演算法。 TLS/SSL 通訊協定使用加密套件中的演算法來建立金鑰和加密資訊。 加密套件會顯示為看似隨機資訊的長字串,但該字串的每個區段都包含重要資訊。 一般而言,此數據字串是由數個主要元件所組成:

  • 通訊協定 (也就是 TLS 1.2 或 TLS 1.3)
  • 金鑰交換或合約演算法
  • 數位簽名 (驗證) 演算法
  • 大量加密演算法
  • 訊息驗證碼演算法 (MAC)

不同版本的 SSL/TLS 支援不同的加密套件。 TLS 1.2 加密套件無法與 TLS 1.3 連線交涉,反之亦然。 截至此,適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器支援許多加密套件,且TLS 1.2 通訊協定版本屬於 HIGH:!aNULL 類別。

針對 SSL\TLS 連線錯誤進行疑難解答

  1. 針對 SSL/TLS 通訊協定版本相容性進行疑難解答的第一個步驟,是識別您或使用者嘗試從用戶端存取您的 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器時所看到的錯誤訊息。 視應用程式和平臺而定,錯誤訊息可能不同,但在許多情況下會指向基礎問題。
  2. 若要確定 SSL/TLS 通訊協定版本相容性,您應該檢查資料庫伺服器和應用程式用戶端的 SSL/TLS 組態,以確定它們支援相容的版本和加密套件。
  3. 分析資料庫伺服器與用戶端 SSL/TLS 版本與加密套件之間的任何差異或差距,並嘗試藉由啟用或停用特定選項、升級或降級軟體,或變更憑證或密鑰來解決它們。 例如,您可能需要根據安全性和相容性需求,在伺服器或用戶端上啟用或停用特定的 SSL/TLS 版本,例如停用 TLS 1.0 和 TLS 1.1,這些版本被視為不安全和已被取代,以及啟用 TLS 1.2 和 TLS 1.3,這些版本更安全且新式。