MySQL 支援多種 TLS 協定與密碼,並可設定允許加密連線使用的協定與密碼。也可以判斷目前工作階段使用的協定與密碼。
MySQL 9.0 支援連線使用的 TLSv1.2 與 TLSv1.3 協定。若要使用 TLSv1.3,MySQL 伺服器與用戶端應用程式都必須使用 OpenSSL 1.1.1 或更高版本編譯。群組複寫元件從 MySQL 8.0.18 開始支援 TLSv1.3 (詳細資訊,請參閱第 20.6.2 節,「使用安全通訊端層 (SSL) 保護群組通訊連線」)。
MySQL 9.0 不支援舊的 TLSv1 與 TLSv1.1 協定。
允許的 TLS 協定可以在伺服器端與用戶端設定,使其僅包含支援的 TLS 協定子集。兩端的設定必須至少包含一個共用的協定,否則連線嘗試無法協商要使用的協定。詳細資訊,請參閱連線 TLS 協定協商。
主機系統可能僅允許特定 TLS 協定,這表示 MySQL 連線無法使用主機不允許的協定,即使 MySQL 本身允許這些協定。此問題可能的解決方法包括以下:
變更系統範圍的主機設定以允許額外的 TLS 協定。請查閱您的作業系統文件以取得指示。例如,您的系統可能有一個
/etc/ssl/openssl.cnf
檔案,其中包含這些行以將 TLS 協定限制為 TLSv1.3 或更高版本:[system_default_sect] MinProtocol = TLSv1.3
將值變更為較低的協定版本或
None
會使系統更寬鬆。此解決方法的缺點是,允許較低 (較不安全) 的協定可能會產生不利的安全性後果。如果您無法或不希望變更主機系統的 TLS 設定,請變更 MySQL 應用程式,以使用主機系統允許的較高(更安全)的 TLS 協定。對於僅支援較低協定版本的舊版 MySQL 而言,這可能無法實現。例如,TLSv1 是 MySQL 5.6.46 之前唯一支援的協定,因此即使用戶端來自支援較高協定版本的較新 MySQL 版本,嘗試連線到 5.6.46 之前的伺服器也會失敗。在這種情況下,可能需要升級到支援額外 TLS 版本的 MySQL 版本。
- 系統範圍的主機設定
-
假設 MySQL 設定允許 TLSv1、TLSv1.1 和 TLSv1.2,但您的主機系統設定僅允許使用 TLSv1.2 或更高版本的連線。在這種情況下,您無法建立使用 TLSv1 或 TLSv1.1 的 MySQL 連線,即使 MySQL 設定為允許這些連線,因為主機系統不允許它們。
如果 MySQL 設定允許 TLSv1、TLSv1.1 和 TLSv1.2,但您的主機系統設定僅允許使用 TLSv1.3 或更高版本的連線,則您根本無法建立 MySQL 連線,因為主機系統不允許任何 MySQL 允許的協定。
在 MySQL 8.0 中,已棄用並移除對 TLSv1 和 TLSv1.1 連線協定的支援。如需背景資訊,請參閱 IETF 備忘錄 Deprecating TLSv1.0 and TLSv1.1。建議使用更安全的 TLSv1.2 和 TLSv1.3 協定進行連線。TLSv1.3 要求 MySQL 伺服器和用戶端應用程式都必須使用 OpenSSL 1.1.1 編譯。
移除對 TLSv1 和 TLSv1.1 的支援,是因為這些協定版本較舊,分別於 1996 年和 2006 年發布。所使用的演算法較弱且已過時。除非您使用非常舊版本的 MySQL 伺服器或連接器,否則您不太可能使用 TLSv1.0 或 TLSv1.1 進行連線。MySQL 連接器和用戶端預設會選擇可用的最高 TLS 版本。
在不支援 TLSv1 和 TLSv1.1 連線協定的版本中,用戶端(包括 MySQL Shell)若支援用於指定連線至 MySQL 伺服器之 TLS 協定的 --tls-version
選項,則無法使用設定為 TLSv1 或 TLSv1.1 的協定建立 TLS/SSL 連線。如果用戶端嘗試使用這些協定連線,對於 TCP 連線,連線會失敗,並且會將錯誤傳回給用戶端。對於 Socket 連線,如果 --ssl-mode
設定為 REQUIRED
,則連線會失敗,否則會建立連線,但會停用 TLS/SSL。
如需詳細資訊,請參閱 MySQL 9.0 是否支援 TLS 1.0 和 1.1?
在伺服器端,tls_version
系統變數的值決定了 MySQL 伺服器允許哪些 TLS 協定用於加密連線。tls_version
值適用於來自用戶端的連線、此伺服器執行個體為來源的常規來源/複本複寫連線、群組複寫群組通訊連線,以及此伺服器執行個體為捐贈者的群組複寫分散式復原連線。管理連線介面的設定方式類似,但使用 admin_tls_version
系統變數(請參閱第 7.1.12.2 節「管理連線管理」)。此討論也適用於 admin_tls_version
。
tls_version
值是一個或多個以逗號分隔的 TLS 協定版本清單,不區分大小寫。預設情況下,此變數會列出用於編譯 MySQL 的 SSL 程式庫和 MySQL 伺服器版本支援的所有協定。因此,預設設定如表 8.13「MySQL 伺服器 TLS 協定預設設定」所示。
表 8.13 MySQL 伺服器 TLS 協定預設設定
MySQL 伺服器版本 | tls_version 預設設定 |
---|---|
MySQL 8.0.15 及更低版本 |
|
MySQL 8.0.16 和 MySQL 8.0.17 |
群組複寫不支援 TLSv1.3 |
MySQL 8.0.18 至 MySQL 8.0.25 |
群組複寫支援 TLSv1.3 |
MySQL 8.0.26 和 MySQL 8.0.27 |
TLSv1 和 TLSv1.1 已棄用 |
MySQL 8.0.28 及更高版本 |
|
若要判斷執行階段的 tls_version
值,請使用此陳述式
mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';
+---------------+-----------------------+
| Variable_name | Value |
+---------------+-----------------------+
| tls_version | TLSv1.2,TLSv1.3 |
+---------------+-----------------------+
若要變更 tls_version
的值,請在伺服器啟動時設定。例如,若要允許使用 TLSv1.2 或 TLSv1.3 協定的連線,但禁止使用安全性較低的 TLSv1 和 TLSv1.1 協定的連線,請在伺服器 my.cnf
檔案中使用下列程式碼行
[mysqld]
tls_version=TLSv1.2,TLSv1.3
若要更嚴格且僅允許 TLSv1.3 連線,請將 tls_version
設定如下
[mysqld]
tls_version=TLSv1.3
可以在執行階段變更 tls_version
。請參閱加密連線的伺服器端執行階段設定和監控。
在用戶端,--tls-version
選項指定用戶端程式允許哪些 TLS 協定來連線至伺服器。選項值的格式與先前描述的 tls_version
系統變數相同(一個或多個以逗號分隔的協定版本清單)。
對於此伺服器執行個體為複本的來源/複本複寫連線,CHANGE REPLICATION SOURCE TO
陳述式的 SOURCE_TLS_VERSION
選項指定複本允許哪些 TLS 協定來連線至來源。選項值的格式與先前描述的 tls_version
系統變數相同。請參閱第 19.3.1 節「設定複寫以使用加密連線」。
可以為 SOURCE_TLS_VERSION
指定的協定取決於 SSL 程式庫。此選項獨立於伺服器 tls_version
值,且不受其影響。例如,設定為複本的伺服器可以使用設定為 TLSv1.3 的 tls_version
,以僅允許使用 TLSv1.3 的連入連線,但也可以使用設定為 TLSv1.2 的 SOURCE_TLS_VERSION
,以僅允許 TLSv1.2 用於對來源的連出複本連線。
對於此伺服器執行個體是啟動分散式復原之加入成員(即用戶端)的群組複寫分散式復原連線,group_replication_recovery_tls_version
系統變數會指定用戶端允許哪些協定。同樣地,此選項獨立於伺服器 tls_version
值,且不受其影響,當此伺服器執行個體為捐贈者時適用。群組複寫伺服器通常會在群組成員資格期間,以捐贈者和加入成員的身分參與分散式復原,因此應設定這兩個系統變數。請參閱第 20.6.2 節「使用安全通訊端層 (SSL) 保護群組通訊連線」。
TLS 協定設定會影響給定連線所使用的協定,如連線 TLS 協定交涉中所述。
應選擇允許的協定,以免在清單中留下「漏洞」。例如,這些伺服器設定值沒有漏洞
tls_version=TLSv1,TLSv1.1,TLSv1.2,TLSv1.3
tls_version=TLSv1.1,TLSv1.2,TLSv1.3
tls_version=TLSv1.2,TLSv1.3
tls_version=TLSv1.3
這些值有漏洞,不應使用
tls_version=TLSv1,TLSv1.2 (TLSv1.1 is missing)
tls_version=TLSv1.1,TLSv1.3 (TLSv1.2 is missing)
禁止出現漏洞的規定也適用於其他設定內容,例如用戶端或複本。
除非您打算停用加密連線,否則允許的協定清單不應為空白。如果您將 TLS 版本參數設定為空字串,則無法建立加密連線
tls_version
:伺服器不允許加密連入連線。--tls-version
:用戶端不允許對伺服器的加密連出連線。SOURCE_TLS_VERSION
:複本不允許對來源的加密連出連線。group_replication_recovery_tls_version
:加入成員不允許對分散式復原連線的加密連線。
預設的加密組會套用至加密連線,可以透過明確設定允許的加密組來覆寫。在建立連線期間,連線雙方都必須允許一些通用的加密組,否則連線會失敗。在雙方通用的允許加密組中,SSL 程式庫會選擇所提供的憑證支援且優先順序最高的加密組。
若要指定適用於使用高達 TLSv1.2 的 TLS 協定的加密連線的加密組
在伺服器端設定
ssl_cipher
系統變數,並針對用戶端程式使用--ssl-cipher
選項。對於此伺服器執行個體為來源的常規來源/複本複寫連線,請設定
ssl_cipher
系統變數。在此伺服器執行個體為複本的情況下,請針對CHANGE REPLICATION SOURCE TO
陳述式使用SOURCE_SSL_CIPHER
選項。請參閱第 19.3.1 節「設定複寫以使用加密連線」。對於群組複寫群組成員,針對群組複寫群組通訊連線以及此伺服器執行個體為捐贈者的群組複寫分散式復原連線,請設定
ssl_cipher
系統變數。針對此伺服器執行個體為加入成員的群組複寫分散式復原連線,請使用group_replication_recovery_ssl_cipher
系統變數。請參閱第 20.6.2 節「使用安全通訊端層 (SSL) 保護群組通訊連線」。
對於使用 TLSv1.3 的加密連線,OpenSSL 1.1.1 及更高版本支援以下密碼套件,所有這些密碼套件預設為啟用,可搭配伺服器系統變數 --tls-ciphersuites
或 --admin-tls-ciphersuites
使用。
TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_CCM_SHA256
在 MySQL 9.0 中,搭配伺服器系統變數 --tls-ciphersuites
或 --admin-tls-ciphersuites
使用 TLS_AES_128_CCM_8_SHA256
會產生棄用警告。
若要明確設定允許的 TLSv1.3 密碼套件,請設定以下參數。在每種情況下,組態值都是以冒號分隔的零個或多個密碼套件名稱清單。
在伺服器端,請使用
tls_ciphersuites
系統變數。如果未設定此變數,其預設值為NULL
,這表示伺服器允許預設的密碼套件集。如果此變數設定為空字串,則不會啟用任何密碼套件,且無法建立加密連線。在用戶端,請使用
--tls-ciphersuites
選項。如果未設定此選項,則用戶端允許預設的密碼套件集。如果此選項設定為空字串,則不會啟用任何密碼套件,且無法建立加密連線。對於一般來源/複本複寫連線,其中此伺服器執行個體為來源,請使用
tls_ciphersuites
系統變數。其中此伺服器執行個體為複本,請針對CHANGE REPLICATION SOURCE TO
陳述式使用SOURCE_TLS_CIPHERSUITES
選項。請參閱第 19.3.1 節「設定複寫以使用加密連線」。對於群組複寫群組成員,對於群組複寫群組通訊連線,以及此伺服器執行個體為捐贈者的群組複寫分散式復原連線,請使用
tls_ciphersuites
系統變數。對於此伺服器執行個體為加入成員的群組複寫分散式復原連線,請使用group_replication_recovery_tls_ciphersuites
系統變數。請參閱第 20.6.2 節「使用安全通訊端層 (SSL) 保護群組通訊連線」。
密碼套件支援需要使用 OpenSSL 1.1.1 或更高版本編譯 MySQL 伺服器和用戶端應用程式。
給定的密碼可能僅適用於特定的 TLS 通訊協定,這會影響 TLS 通訊協定協商程序。請參閱連線 TLS 通訊協定協商。
若要判斷給定的伺服器支援哪些密碼,請檢查 Ssl_cipher_list
狀態變數的工作階段值。
SHOW SESSION STATUS LIKE 'Ssl_cipher_list';
Ssl_cipher_list
狀態變數會列出可能的 SSL 密碼(對於非 SSL 連線為空)。如果 MySQL 支援 TLSv1.3,則該值會包含可能的 TLSv1.3 密碼套件。
ECDSA 密碼僅適用於使用 ECDSA 作為數位簽章的 SSL 憑證,且不適用於使用 RSA 的憑證。MySQL 伺服器自動產生 SSL 憑證的程序不會產生 ECDSA 簽署的憑證,只會產生 RSA 簽署的憑證。除非您有可用的 ECDSA 憑證,否則請勿選取 ECDSA 密碼。
對於使用 TLS.v1.3 的加密連線,MySQL 會使用 SSL 程式庫的預設密碼套件清單。
對於使用 TLS 通訊協定(最高至 TLSv1.2)的加密連線,當搭配伺服器系統變數 --ssl-cipher
和 --admin-ssl-cipher
使用時,MySQL 會將以下預設密碼清單傳遞至 SSL 程式庫。
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-CHACHA20-POLY1305
ECDHE-RSA-CHACHA20-POLY1305
ECDHE-ECDSA-AES256-CCM
ECDHE-ECDSA-AES128-CCM
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES256-CCM
DHE-RSA-AES128-CCM
DHE-RSA-CHACHA20-POLY1305
這些密碼限制已生效
以下密碼已棄用,且當搭配伺服器系統變數
--ssl-cipher
和--admin-ssl-cipher
使用時會產生警告ECDHE-ECDSA-AES128-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-ECDSA-AES256-SHA384 ECDHE-RSA-AES256-SHA384 DHE-DSS-AES128-GCM-SHA256 DHE-RSA-AES128-SHA256 DHE-DSS-AES128-SHA256 DHE-DSS-AES256-GCM-SHA384 DHE-RSA-AES256-SHA256 DHE-DSS-AES256-SHA256 ECDHE-RSA-AES128-SHA ECDHE-ECDSA-AES128-SHA ECDHE-RSA-AES256-SHA ECDHE-ECDSA-AES256-SHA DHE-DSS-AES128-SHA DHE-RSA-AES128-SHA TLS_DHE_DSS_WITH_AES_256_CBC_SHA DHE-RSA-AES256-SHA AES128-GCM-SHA256 DH-DSS-AES128-GCM-SHA256 ECDH-ECDSA-AES128-GCM-SHA256 AES256-GCM-SHA384 DH-DSS-AES256-GCM-SHA384 ECDH-ECDSA-AES256-GCM-SHA384 AES128-SHA256 DH-DSS-AES128-SHA256 ECDH-ECDSA-AES128-SHA256 AES256-SHA256 DH-DSS-AES256-SHA256 ECDH-ECDSA-AES256-SHA384 AES128-SHA DH-DSS-AES128-SHA ECDH-ECDSA-AES128-SHA AES256-SHA DH-DSS-AES256-SHA ECDH-ECDSA-AES256-SHA DH-RSA-AES128-GCM-SHA256 ECDH-RSA-AES128-GCM-SHA256 DH-RSA-AES256-GCM-SHA384 ECDH-RSA-AES256-GCM-SHA384 DH-RSA-AES128-SHA256 ECDH-RSA-AES128-SHA256 DH-RSA-AES256-SHA256 ECDH-RSA-AES256-SHA384 ECDHE-RSA-AES128-SHA ECDHE-ECDSA-AES128-SHA ECDHE-RSA-AES256-SHA ECDHE-ECDSA-AES256-SHA DHE-DSS-AES128-SHA DHE-RSA-AES128-SHA TLS_DHE_DSS_WITH_AES_256_CBC_SHA DHE-RSA-AES256-SHA AES128-SHA DH-DSS-AES128-SHA ECDH-ECDSA-AES128-SHA AES256-SHA DH-DSS-AES256-SHA ECDH-ECDSA-AES256-SHA DH-RSA-AES128-SHA ECDH-RSA-AES128-SHA DH-RSA-AES256-SHA ECDH-RSA-AES256-SHA DES-CBC3-SHA
以下密碼永久受限
!DHE-DSS-DES-CBC3-SHA !DHE-RSA-DES-CBC3-SHA !ECDH-RSA-DES-CBC3-SHA !ECDH-ECDSA-DES-CBC3-SHA !ECDHE-RSA-DES-CBC3-SHA !ECDHE-ECDSA-DES-CBC3-SHA
以下類別的密碼永久受限
!aNULL !eNULL !EXPORT !LOW !MD5 !DES !RC2 !RC4 !PSK !SSLv3
如果伺服器啟動時,ssl_cert
系統變數設定為使用任何前述受限密碼或密碼類別的憑證,則伺服器啟動時將停用對加密連線的支援。
MySQL 中的連線嘗試會協商使用雙方都可用的最高 TLS 通訊協定版本,且雙方都有可用的通訊協定相容加密密碼。協商程序取決於多項因素,例如用於編譯伺服器和用戶端的 SSL 程式庫、TLS 通訊協定和加密密碼組態,以及所使用的金鑰大小
若要成功進行連線嘗試,伺服器和用戶端 TLS 通訊協定組態必須允許某些共通的通訊協定。
同樣地,伺服器和用戶端加密密碼組態必須允許某些共通的密碼。給定的密碼可能僅適用於特定的 TLS 通訊協定,因此除非也有相容的密碼,否則不會選擇可供協商程序使用的通訊協定。
如果 TLSv1.3 可用,則會盡可能使用它。(這表示伺服器和用戶端組態都必須允許 TLSv1.3,且兩者也必須允許某些與 TLSv1.3 相容的加密密碼。)否則,MySQL 會繼續遍歷可用的通訊協定清單,並盡可能使用 TLSv1.2,依此類推。協商會從更安全的通訊協定進行到較不安全的通訊協定。協商順序與設定通訊協定的順序無關。例如,無論
tls_version
的值為TLSv1,TLSv1.1,TLSv1.2,TLSv1.3
或TLSv1.3,TLSv1.2,TLSv1.1,TLSv1
,協商順序都相同。TLSv1.2 不適用於金鑰大小為 512 位元或更小的所有密碼。若要使用此通訊協定搭配此類金鑰,請在伺服器端設定
ssl_cipher
系統變數,或使用--ssl-cipher
用戶端選項來明確指定密碼名稱。AES128-SHA AES128-SHA256 AES256-SHA AES256-SHA256 CAMELLIA128-SHA CAMELLIA256-SHA DES-CBC3-SHA DHE-RSA-AES256-SHA RC4-MD5 RC4-SHA SEED-SHA
為了提高安全性,請使用 RSA 金鑰大小至少為 2048 位元的憑證。
如果伺服器和用戶端沒有共通的允許通訊協定,也沒有共通的通訊協定相容密碼,則伺服器會終止連線要求。範例
如果伺服器設定為
tls_version=TLSv1.1,TLSv1.2
使用
--tls-version=TLSv1
叫用的用戶端,以及僅支援 TLSv1 的較舊用戶端,連線嘗試會失敗。同樣地,對於設定為
SOURCE_TLS_VERSION = 'TLSv1'
的複本,以及僅支援 TLSv1 的較舊複本,連線嘗試會失敗。
如果伺服器設定為
tls_version=TLSv1
,或是僅支援 TLSv1 的較舊伺服器使用
--tls-version=TLSv1.1,TLSv1.2
叫用的用戶端,連線嘗試會失敗。同樣地,對於設定為
SOURCE_TLS_VERSION = 'TLSv1.1,TLSv1.2'
的複本,連線嘗試會失敗。
MySQL 允許指定要支援的通訊協定清單。此清單會直接傳遞至基礎 SSL 程式庫,最終由該程式庫決定實際從提供的清單啟用哪些通訊協定。請參閱 MySQL 原始碼和 OpenSSL SSL_CTX_new()
文件,以取得有關 SSL 程式庫如何處理此問題的資訊。
若要判斷目前用戶端工作階段使用的加密 TLS 通訊協定和密碼,請檢查 Ssl_version
和 Ssl_cipher
狀態變數的工作階段值。
mysql> SELECT * FROM performance_schema.session_status
WHERE VARIABLE_NAME IN ('Ssl_version','Ssl_cipher');
+---------------+---------------------------+
| VARIABLE_NAME | VARIABLE_VALUE |
+---------------+---------------------------+
| Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 |
| Ssl_version | TLSv1.2 |
+---------------+---------------------------+
如果連線未加密,這兩個變數的值皆為空。