有幾個組態參數可用來指示是否使用加密連線,並指定適當的憑證和金鑰檔案。本節提供關於設定伺服器和用戶端以進行加密連線的一般指引
加密連線也可以用於其他內容,如下列其他章節所述
在來源和複寫伺服器之間。請參閱第 19.3.1 節「設定複寫以使用加密連線」。
在群組複寫伺服器之間。請參閱第 20.6.2 節「使用安全通訊端層 (SSL) 保護群組通訊連線」。
透過以 MySQL C API 為基礎的用戶端程式。請參閱加密連線支援。
建立任何所需憑證和金鑰檔案的指示,請參閱第 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.pem
、server-cert.pem
和server-key.pem
的有效憑證和金鑰檔案,它會啟用用戶端的加密連線支援。(這些檔案不需要自動產生;重要的是它們具有這些名稱並且有效。)如果伺服器在資料目錄中找不到有效的憑證和金鑰檔案,它會繼續執行,但不支援加密連線。
如果伺服器自動啟用加密連線支援,它會在錯誤日誌中寫入一個註解。如果伺服器發現 CA 憑證是自我簽署的,它會在錯誤日誌中寫入一個警告。(如果憑證是由伺服器自動建立的,則該憑證是自我簽署的。)
MySQL 還提供了這些系統變數來控制伺服器端的加密連線:
ssl_cipher
:連線加密允許的密碼列表。ssl_crl
:包含憑證撤銷列表的檔案路徑名稱。(ssl_crlpath
類似,但指定憑證撤銷列表檔案的目錄路徑名稱。)tls_version
、tls_ciphersuites
:伺服器允許用於加密連線的加密協定和密碼套件;請參閱第 8.3.2 節「加密連線 TLS 協定和密碼」。例如,您可以設定tls_version
,以防止用戶端使用較不安全的協定。
如果伺服器無法從伺服器端加密連線控制的系統變數建立有效的 TLS 環境,伺服器將在不支援加密連線的情況下執行。
tls_
和 xxx
ssl_
系統變數是動態的,可以在執行階段設定,而不僅僅是在啟動時設定。如果使用 xxx
SET GLOBAL
變更,則新值僅適用於伺服器重新啟動之前。如果使用 SET PERSIST
變更,則新值也會帶到後續的伺服器重新啟動。請參閱第 15.7.6.1 節「設定變數的 SET 語法」。但是,對這些變數的執行階段變更不會立即影響新連線的 TLS 環境,如下一節所述。
隨著啟用對 TLS 環境相關系統變數進行執行階段變更的變更,伺服器也啟用了對新連線所用實際 TLS 環境的執行階段更新。此功能可能很有用,例如,避免重新啟動執行時間過長,其 SSL 憑證已過期的 MySQL 伺服器。
為了建立初始 TLS 環境,伺服器會使用啟動時環境相關系統變數的值。為了公開環境值,伺服器還會初始化一組對應的狀態變數。下表顯示定義 TLS 環境的系統變數以及公開目前作用中環境值的對應狀態變數。
這些作用中的 TLS 環境值也會以屬性的形式公開在 Performance Schema tls_channel_status
表格中,以及任何其他作用中 TLS 環境的屬性。
若要在執行階段重新設定 TLS 環境,請使用此程序:
將每個應變更的 TLS 環境相關系統變數設定為其新值。
執行
ALTER INSTANCE RELOAD TLS
。此陳述式會從 TLS 環境相關系統變數的目前值重新設定作用中的 TLS 環境。它也會設定環境相關的狀態變數,以反映新的作用中環境值。此陳述式需要CONNECTION_ADMIN
權限。在執行
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 環境,但是 Performance Schema tls_channel_status
表格會公開主介面和管理介面的 TLS 屬性。請參閱第 29.12.22.9 節「tls_channel_status 表格」。
更新主介面 TLS 環境具有以下效果:
此更新會變更用於主連線介面上新連線的 TLS 環境。
此更新也會變更用於管理介面上新連線的 TLS 環境,除非該介面設定了一些非預設的 TLS 參數值。
此更新不會影響其他已啟用伺服器外掛程式或元件(例如 Group Replication 或 X Plugin)使用的 TLS 環境。
若要將主介面重新設定套用至 Group Replication 的群組通訊連線,這些連線會從伺服器的 TLS 環境相關系統變數中取得其設定,您必須執行
STOP GROUP_REPLICATION
,然後執行START GROUP_REPLICATION
,以停止並重新啟動 Group Replication。X Plugin 會在外掛程式初始化時初始化其 TLS 環境,如第 22.5.3 節「搭配 X Plugin 使用加密連線」所述。此環境之後不會變更。
預設情況下,如果組態值不允許建立新的 TLS 環境,則 RELOAD TLS
動作會以錯誤回復,並且沒有任何影響。先前的環境值將繼續用於新連線。如果給定選擇性的 NO ROLLBACK ON ERROR
子句,且無法建立新的環境,則不會發生回復。相反地,會產生警告,並且將針對陳述式所套用的介面上新連線停用加密。
如需與建立加密連線相關的用戶端選項的完整列表,請參閱加密連線的命令選項。
預設情況下,如果伺服器支援加密連線,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_ca
、ssl_cert
和 ssl_key
系統變數類似,但 --ssl-cert
和 --ssl-key
識別的是客戶端的公開和私密金鑰。
--ssl-ca
:憑證授權單位 (CA) 憑證檔案的路徑名稱。如果使用此選項,則必須指定與伺服器使用的相同憑證。(--ssl-capath
類似,但指定 CA 憑證檔案目錄的路徑名稱。)--ssl-cert
:客戶端公開金鑰憑證檔案的路徑名稱。--ssl-key
:客戶端私密金鑰檔案的路徑名稱。
為了提高相對於預設加密所提供的安全性,客戶端可以提供與伺服器使用的相符 CA 憑證,並啟用主機名稱身分驗證。如此一來,伺服器和客戶端就會信任相同的 CA 憑證,而客戶端會驗證其連線的主機是否為預期的主機。
若要指定 CA 憑證,請使用
--ssl-ca
(或--ssl-capath
),並指定--ssl-mode=VERIFY_CA
。若要同時啟用主機名稱身分驗證,請使用
--ssl-mode=VERIFY_IDENTITY
而非--ssl-mode=VERIFY_CA
。
使用 VERIFY_IDENTITY
的主機名稱身分驗證不適用於伺服器自動建立的自我簽署憑證(請參閱第 8.3.3.1 節,「使用 MySQL 建立 SSL 和 RSA 憑證與金鑰」)。這類自我簽署憑證不包含伺服器名稱作為「通用名稱」值。
MySQL 也為客戶端加密連線控制提供這些選項
--ssl-cipher
:連線加密允許的密碼列表。--ssl-crl
:包含憑證撤銷列表的檔案路徑名稱。(--ssl-crlpath
類似,但指定憑證撤銷列表檔案目錄的路徑名稱。)--tls-version
、--tls-ciphersuites
:允許的加密協定和密碼套件;請參閱第 8.3.2 節,「加密連線 TLS 協定和密碼」。
根據客戶端所使用的 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 ISSUER
或REQUIRE 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 Server 產生的 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
,則如果憑證無效,伺服器會停止執行啟動。伺服器會根據憑證的狀態,提供有效的偵錯訊息、錯誤訊息或兩者,以通知 DBA。這項功能可能很有用,例如,可以避免重新啟動已執行很長時間以致 SSL 憑證過期的 MySQL 伺服器。
同樣地,當您執行 ALTER INSTANCE RELOAD TLS
陳述式以在執行階段變更 TLS 內容時,如果驗證失敗,則不會使用新的伺服器和 CA 憑證檔案。在這種情況下,伺服器會繼續使用舊憑證。如需關於動態變更 TLS 內容的詳細資訊,請參閱伺服器端加密連線的執行階段組態和監控。
驗證 CA 憑證
對於使用伺服器主要介面的連線
如果指定了
--ssl_ca
,則伺服器會驗證對應的 CA 憑證,並向 DBA 發出適當的警告訊息。如果指定了
--ssl_capath
,伺服器會驗證指定資料夾中的所有 CA 憑證,並向 DBA 發出適當的警告訊息。如果未指定 SSL 參數,伺服器預設會驗證資料目錄中存在的 CA 憑證,並向 DBA 發出適當的警告訊息。
對於使用伺服器管理介面的連線:
如果指定了
--admin_ssl_ca
,伺服器會驗證指定的 CA 憑證,並向 DBA 發出適當的警告訊息。如果指定了
--admin_ssl_capath
,伺服器會驗證指定資料夾中的所有 CA 憑證,並向 DBA 發出適當的警告訊息。如果未指定管理 SSL 參數,伺服器預設會驗證資料目錄中存在的 CA 憑證,並向 DBA 發出適當的警告訊息。
驗證伺服器憑證
對於使用伺服器主要介面的連線
如果未指定
--ssl_cert
,伺服器會驗證預設資料目錄中的伺服器憑證。如果指定了
--ssl_cert
,伺服器會驗證伺服器憑證,並會考量是否指定了--ssl_crl
。如果 DBA 設定命令列選項來驗證憑證,當憑證無效時,伺服器會停止運作,並向 DBA 顯示適當的錯誤訊息。否則,伺服器會向 DBA 發出警告訊息,然後啟動伺服器。
對於使用伺服器管理介面的連線:
如果未指定
--admin_ssl_cert
,伺服器會驗證預設資料目錄中的伺服器憑證。如果指定了
--admin_ssl_cert
,伺服器會驗證伺服器憑證,並會考量是否指定了--admin_ssl_crl
。如果 DBA 設定命令列選項來驗證憑證,當憑證無效時,伺服器會停止運作,並向 DBA 顯示適當的錯誤訊息。否則,伺服器會向 DBA 發出警告訊息,然後啟動伺服器。
對於某些 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
選項值 REQUIRED
、VERIFY_CA
或 VERIFY_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
陳述式。