文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  設定 MySQL 使用加密連線

8.3.1 設定 MySQL 使用加密連線

有多個設定參數可用於指示是否使用加密連線,並指定適當的憑證和金鑰檔案。本節提供關於為加密連線設定伺服器和用戶端的一般指導

加密連線也可以在其他內容中使用,如以下其他章節所述

建立任何所需憑證和金鑰檔案的指示,請參閱第 8.3.3 節,「建立 SSL 和 RSA 憑證和金鑰」

加密連線的伺服器端啟動設定

若要要求用戶端使用加密連線連線,請啟用 require_secure_transport 系統變數。請參閱將加密連線設定為強制性

伺服器端的這些系統變數指定伺服器在允許客戶端建立加密連線時使用的憑證和金鑰檔案。

  • ssl_ca:憑證授權單位 (CA) 憑證檔案的路徑名稱。(ssl_capath 類似,但指定 CA 憑證檔案目錄的路徑名稱。)

  • ssl_cert:伺服器公鑰憑證檔案的路徑名稱。此憑證可以傳送給客戶端,並根據客戶端擁有的 CA 憑證進行驗證。

  • ssl_key:伺服器私鑰檔案的路徑名稱。

例如,要啟用伺服器的加密連線,請在 my.cnf 檔案中使用以下幾行啟動伺服器,並根據需要變更檔案名稱。

[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem

若要額外指定客戶端必須使用加密連線,請啟用 require_secure_transport 系統變數。

[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
require_secure_transport=ON

每個憑證和金鑰系統變數都命名一個 PEM 格式的檔案。如果您需要建立所需的憑證和金鑰檔案,請參閱第 8.3.3 節「建立 SSL 和 RSA 憑證與金鑰」。使用 OpenSSL 編譯的 MySQL 伺服器可以在啟動時自動產生遺失的憑證和金鑰檔案。請參閱第 8.3.3.1 節「使用 MySQL 建立 SSL 和 RSA 憑證與金鑰」。或者,如果您有 MySQL 原始碼發行版,您可以使用其 mysql-test/std_data 目錄中的示範憑證和金鑰檔案來測試您的設定。

伺服器會執行憑證和金鑰檔案的自動探索。如果沒有提供明確的加密連線選項來設定加密連線,伺服器會在啟動時嘗試自動啟用加密連線支援。

  • 如果伺服器在資料目錄中發現名為 ca.pemserver-cert.pemserver-key.pem 的有效憑證和金鑰檔案,則會啟用客戶端的加密連線支援。(這些檔案不一定需要自動產生;重要的是它們具有這些名稱且有效。)

  • 如果伺服器在資料目錄中找不到有效的憑證和金鑰檔案,它會繼續執行,但不支援加密連線。

如果伺服器自動啟用加密連線支援,則會在錯誤日誌中寫入註記。如果伺服器發現 CA 憑證是自我簽署的,則會在錯誤日誌中寫入警告。(如果憑證是由伺服器自動建立的,則該憑證是自我簽署的。)

MySQL 也提供以下這些系統變數,用於伺服器端的加密連線控制:

如果伺服器無法從伺服器端加密連線控制的系統變數中建立有效的 TLS 環境,則伺服器將在不支援加密連線的情況下執行。

加密連線的伺服器端執行時間組態和監控

tls_xxxssl_xxx 系統變數是動態的,可以在執行時間設定,而不僅僅是在啟動時設定。如果使用 SET GLOBAL 變更,則新值僅適用於伺服器重新啟動之前。如果使用 SET PERSIST 變更,則新值也會延續到後續的伺服器重新啟動。請參閱第 15.7.6.1 節「用於變數指派的 SET 語法」。但是,對這些變數的執行時間變更不會立即影響新連線的 TLS 環境,如本節稍後所述。

隨著啟用對 TLS 環境相關系統變數進行執行時間變更的變更,伺服器也會啟用對用於新連線的實際 TLS 環境進行執行時間更新。此功能可能很有用,例如,避免重新啟動已執行很長時間且 SSL 憑證已過期的 MySQL 伺服器。

若要建立初始 TLS 環境,伺服器會使用環境相關系統變數在啟動時具有的值。若要公開環境值,伺服器也會初始化一組對應的狀態變數。下表顯示了定義 TLS 環境的系統變數,以及公開目前活動環境值的對應狀態變數。


這些活動的 TLS 環境值也會作為效能綱要 tls_channel_status 表格中的屬性公開,以及任何其他活動的 TLS 環境的屬性。

若要在執行時間重新設定 TLS 環境,請使用此程序:

  1. 將每個應該變更的 TLS 環境相關系統變數設定為其新值。

  2. 執行 ALTER INSTANCE RELOAD TLS。此陳述式會從 TLS 環境相關系統變數的目前值重新設定活動的 TLS 環境。它也會設定與環境相關的狀態變數,以反映新的活動環境值。此陳述式需要 CONNECTION_ADMIN 權限。

  3. 在執行 ALTER INSTANCE RELOAD TLS 之後建立的新連線會使用新的 TLS 環境。現有連線不受影響。如果應該終止現有連線,請使用 KILL 陳述式。

由於重新設定程序的工作方式,每對系統和狀態變數的成員可能暫時具有不同的值:

  • ALTER INSTANCE RELOAD TLS 之前的系統變數變更不會變更 TLS 環境。此時,這些變更對新連線沒有影響,而且對應的環境相關系統和狀態變數可能具有不同的值。這使您能夠對個別系統變數進行任何必要的變更,然後在完成所有系統變數變更後,使用 ALTER INSTANCE RELOAD TLS 以原子方式更新活動的 TLS 環境。

  • ALTER INSTANCE RELOAD TLS 之後,對應的系統和狀態變數會具有相同的值。在下次變更系統變數之前,這會保持不變。

在某些情況下,ALTER INSTANCE RELOAD TLS 本身可能足以重新設定 TLS 環境,而無需變更任何系統變數。假設由 ssl_cert 命名的檔案中的憑證已過期。只要將現有檔案內容取代為未過期的憑證並執行 ALTER INSTANCE RELOAD TLS,即可讓新的檔案內容被讀取並用於新連線。

伺服器會為管理連線介面實作獨立的連線加密設定。請參閱管理介面的加密連線支援。此外,ALTER INSTANCE RELOAD TLS 會擴充 FOR CHANNEL 子句,該子句可指定要重新載入 TLS 環境的通道(介面)。請參閱第 15.1.5 節「ALTER INSTANCE 陳述式」。沒有狀態變數可公開管理介面 TLS 環境,但是效能綱要 tls_channel_status 表格會公開主要和管理介面的 TLS 屬性。請參閱第 29.12.22.9 節「tls_channel_status 表格」

更新主要介面 TLS 環境具有以下影響:

  • 此更新會變更用於主要連線介面上新連線的 TLS 環境。

  • 此更新也會變更用於管理介面上新連線的 TLS 環境,除非為該介面設定了某些非預設的 TLS 參數值。

  • 此更新不會影響其他已啟用的伺服器外掛程式或元件(例如群組複寫或 X 外掛程式)所使用的 TLS 環境。

預設情況下,如果組態值不允許建立新的 TLS 環境,則 RELOAD TLS 動作會回滾並產生錯誤,且不會有任何作用。先前的環境值會繼續用於新的連線。如果提供可選的 NO ROLLBACK ON ERROR 子句,且無法建立新的環境,則不會發生回滾。相反地,會產生警告,並且將會停用該語句所應用介面上新連線的加密。

在連線介面上啟用或停用加密連線的選項僅在啟動時有效。例如,--tls-version--admin-tls-version 選項僅在啟動時影響主介面和管理介面是否支援這些 TLS 版本。這些選項在執行階段會被忽略,且對 ALTER INSTANCE RELOAD TLS 的操作沒有影響。例如,您可以設定 tls_version='' 以在主介面上停用加密連線的情況下啟動伺服器,然後重新組態 TLS 並執行 ALTER INSTANCE RELOAD TLS 以在執行階段啟用加密連線。

加密連線的用戶端組態

如需與建立加密連線相關的完整用戶端選項清單,請參閱加密連線的指令選項

預設情況下,如果伺服器支援加密連線,MySQL 用戶端程式會嘗試建立加密連線,並可透過 --ssl-mode 選項進行進一步的控制。

  • 在沒有 --ssl-mode 選項的情況下,用戶端會嘗試使用加密進行連線,如果無法建立加密連線,則會回復為未加密的連線。這也是使用明確的 --ssl-mode=PREFERRED 選項時的行為。

  • 使用 --ssl-mode=REQUIRED,用戶端需要加密連線,如果無法建立加密連線,則會失敗。

  • 使用 --ssl-mode=DISABLED,用戶端會使用未加密的連線。

  • 使用 --ssl-mode=VERIFY_CA--ssl-mode=VERIFY_IDENTITY,用戶端需要加密連線,並針對伺服器 CA 憑證執行驗證,且(使用 VERIFY_IDENTITY 時)針對伺服器憑證中的主機名稱執行驗證。

重要事項

預設設定 --ssl-mode=PREFERRED 如果其他預設設定未變更,則會產生加密連線。然而,為了協助防止複雜的中間人攻擊,用戶端驗證伺服器的身分至關重要。設定 --ssl-mode=VERIFY_CA--ssl-mode=VERIFY_IDENTITY 是比預設設定更好的選擇,有助於防止這種類型的攻擊。VERIFY_CA 使用戶端檢查伺服器的憑證是否有效。VERIFY_IDENTITY 使用戶端檢查伺服器的憑證是否有效,並使用戶端檢查用戶端正在使用的主機名稱是否與伺服器憑證中的身分相符。若要實作這些設定之一,您必須先確保伺服器的 CA 憑證在您的環境中可供所有使用它的用戶端可靠地使用,否則將會產生可用性問題。因此,它們並非預設設定。

如果伺服器端啟用了 require_secure_transport 系統變數,導致伺服器需要加密連線,則建立未加密連線的嘗試會失敗。請參閱將加密連線設定為強制

用戶端上的以下選項可識別用戶端在建立與伺服器的加密連線時所使用的憑證和金鑰檔案。它們與伺服器端使用的 ssl_cassl_certssl_key 系統變數類似,但 --ssl-cert--ssl-key 可識別用戶端的公鑰和私鑰。

  • --ssl-ca:憑證授權單位 (CA) 憑證檔案的路徑名稱。如果使用此選項,則必須指定伺服器使用的相同憑證。( --ssl-capath 類似,但指定 CA 憑證檔案目錄的路徑名稱。)

  • --ssl-cert:用戶端公鑰憑證檔案的路徑名稱。

  • --ssl-key:用戶端私鑰檔案的路徑名稱。

相對於預設加密提供的安全性,用戶端可以提供與伺服器使用的憑證相符的 CA 憑證,並啟用主機名稱身分驗證。如此一來,伺服器和用戶端會將信任放在相同的 CA 憑證中,而用戶端會驗證它所連線的主機是否為預期的主機。

注意

使用 VERIFY_IDENTITY 進行的主機名稱身分驗證不適用於伺服器自動建立的自我簽署憑證 (請參閱第 8.3.3.1 節,「使用 MySQL 建立 SSL 和 RSA 憑證和金鑰」)。這類自我簽署憑證不包含伺服器名稱做為通用名稱值。

MySQL 也提供這些選項來控制用戶端加密連線

根據用戶端使用的 MySQL 帳戶的加密需求,可能需要用戶端指定某些選項,才能使用加密連線到 MySQL 伺服器。

假設您想要使用沒有特殊加密需求的帳戶或使用包含 REQUIRE SSL 子句的 CREATE USER 陳述式建立的帳戶進行連線。假設伺服器支援加密連線,則用戶端可以使用加密進行連線,而無需使用 --ssl-mode 選項或使用明確的 --ssl-mode=PREFERRED 選項。

mysql

mysql --ssl-mode=PREFERRED

對於使用 REQUIRE SSL 子句建立的帳戶,如果無法建立加密連線,則連線嘗試會失敗。對於沒有特殊加密需求的帳戶,如果無法建立加密連線,則嘗試會回復為未加密的連線。若要防止回復,並且在無法取得加密連線時失敗,請像這樣連線

mysql --ssl-mode=REQUIRED

如果帳戶具有更嚴格的安全性需求,則必須指定其他選項才能建立加密連線。

  • 對於使用 REQUIRE X509 子句建立的帳戶,用戶端必須至少指定 --ssl-cert--ssl-key。此外,建議使用 --ssl-ca (或 --ssl-capath ),以便驗證伺服器提供的公開憑證。例如 (在單行上輸入指令)

    mysql --ssl-ca=ca.pem
          --ssl-cert=client-cert.pem
          --ssl-key=client-key.pem
  • 對於使用 REQUIRE ISSUERREQUIRE SUBJECT 子句建立的帳戶,加密需求與 REQUIRE X509 的加密需求相同,但憑證必須分別與帳戶定義中指定的發行者或主體相符。

如需關於 REQUIRE 子句的其他資訊,請參閱第 15.7.1.3 節,「CREATE USER 陳述式」

MySQL 伺服器可以產生用戶端憑證和金鑰檔案,供用戶端用來連線到 MySQL 伺服器執行個體。請參閱第 8.3.3 節,「建立 SSL 和 RSA 憑證和金鑰」

重要事項

如果連線到 MySQL 伺服器執行個體的用戶端使用具有 extendedKeyUsage 擴充功能 (X.509 v3 擴充功能) 的 SSL 憑證,則擴充金鑰使用必須包含用戶端驗證 ( clientAuth )。如果 SSL 憑證僅指定用於伺服器驗證 ( serverAuth ) 和其他非用戶端憑證目的,則憑證驗證會失敗,而且用戶端與 MySQL 伺服器執行個體的連線會失敗。MySQL 伺服器產生的 SSL 憑證中沒有 extendedKeyUsage 擴充功能 (如第 8.3.3.1 節,「使用 MySQL 建立 SSL 和 RSA 憑證和金鑰」中所述),且使用 openssl 指令,按照第 8.3.3.2 節,「使用 openssl 建立 SSL 憑證和金鑰」中的指示建立的 SSL 憑證中也沒有此擴充功能。如果您使用以其他方式建立的自有用戶端憑證,請確保任何 extendedKeyUsage 擴充功能都包含用戶端驗證。

若要防止使用加密並覆寫其他 --ssl-xxx 選項,請使用 --ssl-mode=DISABLED 叫用用戶端程式。

mysql --ssl-mode=DISABLED

若要判斷目前與伺服器的連線是否使用加密,請檢查 Ssl_cipher 狀態變數的會期值。如果值為空,則連線未加密。否則,連線已加密,且該值表示加密密碼。例如

mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
+---------------+---------------------------+
| Variable_name | Value                     |
+---------------+---------------------------+
| Ssl_cipher    | DHE-RSA-AES128-GCM-SHA256 |
+---------------+---------------------------+

對於 mysql 用戶端,另一種方法是使用 STATUS\s 命令,並檢查 SSL

mysql> \s
...
SSL: Not in use
...

mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256
...

設定強制執行憑證驗證

--tls-certificates-enforced-validation 選項可在伺服器啟動時啟用伺服器公鑰憑證檔案、憑證授權單位 (CA) 憑證檔案和憑證撤銷清單檔案的驗證

mysqld --tls-certificates-enforced-validation

如果設定為 ON,若憑證無效,伺服器將停止執行啟動。伺服器會提供有效的偵錯訊息、錯誤訊息或兩者,具體取決於憑證的狀態,來通知資料庫管理員。例如,此功能可能有用於避免重新啟動執行時間過長,導致其 SSL 憑證過期的 MySQL 伺服器。

同樣地,當您執行 ALTER INSTANCE RELOAD TLS 陳述式以在執行階段變更 TLS 內容時,如果驗證失敗,則不會使用新的伺服器和 CA 憑證檔案。在這種情況下,伺服器會繼續使用舊的憑證。如需有關動態變更 TLS 內容的詳細資訊,請參閱加密連線的伺服器端執行階段設定和監控

驗證 CA 憑證

對於使用伺服器主要介面的連線

  • 如果指定 --ssl_ca,則伺服器會驗證各自的 CA 憑證,並向資料庫管理員提供適當的警告訊息。

  • 如果指定 --ssl_capath,則伺服器會驗證各自資料夾中的所有 CA 憑證,並向資料庫管理員提供適當的警告訊息。

  • 如果未指定 SSL 參數,伺服器預設會驗證資料目錄中存在的 CA 憑證,並向資料庫管理員提供適當的警告訊息。

對於使用伺服器管理介面的連線

  • 如果指定 --admin_ssl_ca,則伺服器會驗證各自的 CA 憑證,並向資料庫管理員提供適當的警告訊息。

  • 如果指定 --admin_ssl_capath,則伺服器會驗證各自資料夾中的所有 CA 憑證,並向資料庫管理員提供適當的警告訊息。

  • 如果未指定管理 SSL 參數,伺服器預設會驗證資料目錄中存在的 CA 憑證,並向資料庫管理員提供適當的警告訊息。

驗證伺服器憑證

對於使用伺服器主要介面的連線

  • 如果未指定 --ssl_cert,則伺服器會驗證預設資料目錄中的伺服器憑證。

  • 如果提供 --ssl_cert,則伺服器會驗證伺服器憑證,並考慮是否已指定 --ssl_crl

  • 如果資料庫管理員設定命令列選項來驗證憑證,則若憑證無效,伺服器會停止,並向資料庫管理員顯示適當的錯誤訊息。否則,伺服器會向資料庫管理員發出警告訊息,而伺服器會啟動。

對於使用伺服器管理介面的連線

  • 如果未指定 --admin_ssl_cert,則伺服器會驗證預設資料目錄中的伺服器憑證。

  • 如果提供 --admin_ssl_cert,則伺服器會驗證伺服器憑證,並考慮是否已指定 --admin_ssl_crl

  • 如果資料庫管理員設定命令列選項來驗證憑證,則若憑證無效,伺服器會停止,並向資料庫管理員顯示適當的錯誤訊息。否則,伺服器會向資料庫管理員發出警告訊息,而伺服器會啟動。

設定強制加密連線

對於某些 MySQL 部署,使用加密連線可能不僅是合乎需求的,而且是強制性的 (例如,為了滿足法規要求)。本節討論可讓您執行此操作的組態設定。這些控制層級可用

  • 您可以設定伺服器,要求用戶端使用加密連線進行連線。

  • 您可以叫用個別的用戶端程式,要求加密連線,即使伺服器允許但不要求加密也是如此。

  • 您可以設定個別的 MySQL 帳戶,使其只能透過加密連線使用。

若要要求用戶端使用加密連線進行連線,請啟用 require_secure_transport 系統變數。例如,將以下幾行放在伺服器 my.cnf 檔案中

[mysqld]
require_secure_transport=ON

或者,若要在執行階段設定和持續此值,請使用此陳述式

SET PERSIST require_secure_transport=ON;

SET PERSIST 設定正在執行的 MySQL 執行個體的值。它也會儲存該值,使其在後續伺服器重新啟動時使用。請參閱第 15.7.6.1 節,「SET 語法以進行變數指派」

啟用 require_secure_transport 後,用戶端與伺服器的連線必須使用某種形式的安全傳輸,而且伺服器只允許使用 SSL 的 TCP/IP 連線,或使用 Socket 檔案 (在 Unix 上) 或共用記憶體 (在 Windows 上) 的連線。伺服器會拒絕不安全的連線嘗試,並出現 ER_SECURE_TRANSPORT_REQUIRED 錯誤。

若要叫用用戶端程式,使其無論伺服器是否需要加密,都需要加密連線,請使用 --ssl-mode 選項值 REQUIREDVERIFY_CAVERIFY_IDENTITY。例如

mysql --ssl-mode=REQUIRED
mysqldump --ssl-mode=VERIFY_CA
mysqladmin --ssl-mode=VERIFY_IDENTITY

若要將 MySQL 帳戶設定為只能透過加密連線使用,請在建立帳戶的 CREATE USER 陳述式中加入 REQUIRE 子句,並在該子句中指定您需要的加密特性。例如,若要要求加密連線和使用有效的 X.509 憑證,請使用 REQUIRE X509

CREATE USER 'jeffrey'@'localhost' REQUIRE X509;

如需關於 REQUIRE 子句的其他資訊,請參閱第 15.7.1.3 節,「CREATE USER 陳述式」

若要修改沒有加密需求的現有帳戶,請使用 ALTER USER 陳述式。