文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 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 參考手冊  /  ...  /  加密連線 TLS 協定與密碼

8.3.2 加密連線 TLS 協定與密碼

MySQL 支援多種 TLS 協定和密碼,並可設定允許用於加密連線的協定和密碼。也可以判斷目前工作階段使用的協定和密碼。

支援的 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 協定的支援

對 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 協定組態

在伺服器端,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 和更早版本

TLSv1,TLSv1.1,TLSv1.2

MySQL 8.0.16 和 MySQL 8.0.17

TLSv1,TLSv1.1,TLSv1.2,TLSv1.3 (使用 OpenSSL 1.1.1)

TLSv1,TLSv1.1,TLSv1.2 (否則)

群組複寫不支援 TLSv1.3

MySQL 8.0.18 至 MySQL 8.0.25

TLSv1,TLSv1.1,TLSv1.2,TLSv1.3 (使用 OpenSSL 1.1.1)

TLSv1,TLSv1.1,TLSv1.2 (否則)

群組複寫支援 TLSv1.3

MySQL 8.0.26 和 MySQL 8.0.27

TLSv1,TLSv1.1,TLSv1.2,TLSv1.3 (使用 OpenSSL 1.1.1)

TLSv1,TLSv1.1,TLSv1.2 (否則)

TLSv1 和 TLSv1.1 已棄用

MySQL 8.0.28 及更新版本

TLSv1.2,TLSv1.3


若要在執行階段判斷 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 版本參數設定為空字串,則無法建立加密連線

連線密碼組態

預設的一組密碼適用於加密連線,可以透過明確組態允許的密碼來覆寫。在建立連線期間,連線的雙方都必須允許一些共用的密碼,否則連線會失敗。在雙方共用的允許密碼中,SSL 函式庫會選擇提供的憑證所支援的、優先順序最高的密碼。

若要指定適用於使用 TLS 協定 (最高至 TLSv1.2) 的加密連線的密碼

對於使用 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 密碼套件,請設定下列參數。在每種情況下,組態值都是零個或多個以冒號分隔的密碼套件名稱的清單。

密碼套件支援要求 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 系統變數設定為使用任何上述限制密碼或密碼類別的憑證來啟動伺服器,則伺服器啟動時會停用對加密連線的支援。

連線 TLS 通訊協定協商

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 通訊協定和密碼

若要判斷目前用戶端工作階段使用的加密 TLS 通訊協定和密碼,請檢查 Ssl_versionSsl_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                   |
+---------------+---------------------------+

如果連線未加密,則這兩個變數都具有空值。