MySQL 支援多種 TLS 協定和密碼,並可設定允許用於加密連線的協定和密碼。也可以判斷目前工作階段使用的協定和密碼。
MySQL 8.4 支援連線的 TLSv1.2 和 TLSv1.3 協定。若要使用 TLSv1.3,MySQL 伺服器和用戶端應用程式都必須使用 OpenSSL 1.1.1 或更高版本編譯。群組複寫元件從 MySQL 8.0.18 開始支援 TLSv1.3(詳細資訊請參閱章節 20.6.2,「使用安全通訊端層 (SSL) 保護群組通訊連線」)。
MySQL 8.4 不支援舊的 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 是 5.6.46 之前的 MySQL 唯一支援的協定,因此即使客戶端來自支援更高協定版本的新版 MySQL,嘗試連線到 5.6.46 之前的伺服器也會失敗。在這種情況下,可能需要升級到支援其他 TLS 版本的新版 MySQL。
- 系統層級主機組態
-
假設 MySQL 組態允許 TLSv1、TLSv1.1 和 TLSv1.2,但您的主機系統組態只允許使用 TLSv1.2 或更高版本的連線。在這種情況下,即使 MySQL 設定為允許它們,您也無法建立使用 TLSv1 或 TLSv1.1 的 MySQL 連線,因為主機系統不允許它們。
如果 MySQL 組態允許 TLSv1、TLSv1.1 和 TLSv1.2,但您的主機系統組態只允許使用 TLSv1.3 或更高版本的連線,您將完全無法建立 MySQL 連線,因為沒有任何 MySQL 允許的協定是主機系統所允許的。
對 TLSv1 和 TLSv1.1 連線協定的支援已在 MySQL 8.0 中被棄用並移除。關於背景資訊,請參閱 IETF 備忘錄 棄用 TLSv1.0 和 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 連線協定的版本中,支援 --tls-version
選項以指定連線至 MySQL 伺服器的 TLS 協定的用戶端(包括 MySQL Shell),無法建立將協定設定為 TLSv1 或 TLSv1.1 的 TLS/SSL 連線。如果用戶端嘗試使用這些協定連線,對於 TCP 連線,連線會失敗,並且會將錯誤傳回給用戶端。對於 Socket 連線,如果 --ssl-mode
設定為 REQUIRED
,連線會失敗,否則會建立連線但會停用 TLS/SSL。
如需更多資訊,請參閱 MySQL 8.4 是否支援 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
值影響。例如,可以將作為複本的伺服器設定為將 tls_version
設定為 TLSv1.3,以僅允許使用 TLSv1.3 的傳入連線,但也可以將 SOURCE_TLS_VERSION
設定為 TLSv1.2,以僅允許 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 函式庫會選擇提供的憑證所支援的、優先順序最高的密碼。
若要指定適用於使用 TLS 協定 (最高至 TLSv1.2) 的加密連線的密碼
在伺服器端設定
ssl_cipher
系統變數,並將--ssl-cipher
選項用於用戶端程式。對於此伺服器執行個體為來源的常規來源/複本複寫連線,請設定
ssl_cipher
系統變數。當此伺服器執行個體為複本時,請將SOURCE_SSL_CIPHER
選項用於CHANGE REPLICATION SOURCE TO
陳述式。請參閱 第 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 8.4 中,使用 TLS_AES_128_CCM_8_SHA256
與伺服器系統變數 --tls-ciphersuites
或 --admin-tls-ciphersuites
會產生棄用警告。
若要明確設定允許的 TLSv1.3 密碼套件,請設定下列參數。在每種情況下,組態值都是零個或多個以冒號分隔的密碼套件名稱的清單。
在伺服器端,請使用
tls_ciphersuites
系統變數。如果未設定此變數,其預設值為NULL
,表示伺服器允許預設的密碼套件集。如果將變數設定為空字串,則不會啟用任何密碼套件,且無法建立加密連線。在用戶端,請使用
--tls-ciphersuites
選項。如果未設定此選項,用戶端會允許預設的密碼套件集。如果將選項設定為空字串,則不會啟用任何密碼套件,且無法建立加密連線。對於一般來源/複本複寫連線,當此伺服器實例為來源時,請使用
tls_ciphersuites
系統變數。當此伺服器實例為複本時,請使用CHANGE REPLICATION SOURCE TO
陳述式的SOURCE_TLS_CIPHERSUITES
選項。請參閱第 19.3.1 節,「設定複寫以使用加密連線」。對於 Group Replication 群組成員,針對 Group Replication 群組通訊連線以及此伺服器實例為捐贈者的 Group Replication 分散式復原連線,請使用
tls_ciphersuites
系統變數。對於此伺服器實例為加入成員的 Group Replication 分散式復原連線,請使用group_replication_recovery_tls_ciphersuites
系統變數。請參閱第 20.6.2 節,「使用安全通訊端層 (SSL) 保護群組通訊連線」。
密碼套件支援要求 MySQL 伺服器和用戶端應用程式都必須使用 OpenSSL 1.1.1 或更高版本編譯。
給定的密碼可能僅適用於特定的 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
為了提高安全性,請使用具有至少 2048 位元 RSA 金鑰大小的憑證。
如果伺服器和用戶端沒有共通的允許通訊協定,且沒有共通的與通訊協定相容的密碼,則伺服器會終止連線請求。範例
如果伺服器設定為
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 |
+---------------+---------------------------+
如果連線未加密,則這兩個變數都具有空值。