如果伺服器在其執行階段快取中具有會話,MySQL 客戶端程式可以選擇恢復先前的 SSL 會話。本節說明有利於重複使用 SSL 會話的條件、用於管理和監控會話快取的伺服器變數,以及用於儲存和重複使用會話資料的客戶端命令列選項。
每次完整的 TLS 交換在計算和網路開銷方面都可能很昂貴,如果使用 TLSv1.3,則開銷較少。藉由從已建立的會話中擷取會話票證,然後在建立下一個連線時提交該票證,如果可以重複使用會話,則可以降低整體成本。例如,考慮擁有可以開啟多個連線並產生更快速度的網頁的好處。
一般而言,必須滿足以下條件才能重複使用 SSL 會話
伺服器必須將其會話快取保留在記憶體中。
伺服器端的會話快取逾時不得過期。
每個客戶端都必須維護使用中的會話快取並確保其安全。
C 應用程式可以使用 C API 功能,為加密連線啟用會話重複使用 (請參閱 SSL 會話重複使用)。
為了建立初始 TLS 環境,伺服器會使用與環境相關的系統變數在啟動時具有的值。為了公開環境值,伺服器還會初始化一組對應的狀態變數。下表顯示定義伺服器執行階段會話快取的系統變數,以及公開目前使用中會話快取值的對應狀態變數。
當 ssl_session_cache_mode
伺服器變數的值為 ON
時(這是預設模式),Ssl_session_cache_mode
狀態變數的值為 SERVER
。
SSL 會話快取變數適用於 mysql_main
和 mysql_admin
TLS 通道。它們的值也會作為 Performance Schema tls_channel_status
表中的屬性公開,以及任何其他活動 TLS 上下文的屬性。
若要在執行階段重新設定 SSL 會話快取,請使用以下程序:
將每個應變更的快取相關系統變數設定為其新值。例如,將快取逾時值從預設值 (300 秒) 變更為 600 秒:
mysql> SET GLOBAL ssl_session_cache_timeout = 600;
由於重新設定程序的方式,每對系統和狀態變數的成員可能會暫時具有不同的值。
mysql> SHOW VARIABLES LIKE 'ssl_session_cache_timeout'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | ssl_session_cache_timeout | 600 | +---------------------------+-------+ 1 row in set (0.00 sec) mysql> SHOW STATUS LIKE 'Ssl_session_cache_timeout'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | Ssl_session_cache_timeout | 300 | +---------------------------+-------+ 1 row in set (0.00 sec)
如需設定變數值的其他資訊,請參閱系統變數指派。
執行
ALTER INSTANCE RELOAD TLS
。此陳述式會從快取相關系統變數的目前值重新設定活動的 TLS 上下文。它也會設定快取相關的狀態變數,以反映新的活動快取值。此陳述式需要CONNECTION_ADMIN
權限。mysql> ALTER INSTANCE RELOAD TLS; Query OK, 0 rows affected (0.01 sec) mysql> SHOW VARIABLES LIKE 'ssl_session_cache_timeout'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | ssl_session_cache_timeout | 600 | +---------------------------+-------+ 1 row in set (0.00 sec) mysql> SHOW STATUS LIKE 'Ssl_session_cache_timeout'; +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | Ssl_session_cache_timeout | 600 | +---------------------------+-------+ 1 row in set (0.00 sec)
執行
ALTER INSTANCE RELOAD TLS
後建立的新連線會使用新的 TLS 上下文。現有的連線不受影響。
所有 MySQL 用戶端程式都可以在與相同伺服器建立新的加密連線時重複使用先前的會話,前提是您在原始連線仍然有效時儲存了會話資料。會話資料會儲存到檔案中,您在再次叫用用戶端時指定此檔案。
若要儲存和重複使用 SSL 會話資料,請使用以下程序:
叫用 mysql 來建立與執行 MySQL 8.4 的伺服器的加密連線。
使用 ssl_session_data_print 命令指定您可以安全儲存目前活動會話資料的檔案路徑。例如:
mysql> ssl_session_data_print ~/private-dir/session.txt
會話資料以 Null 終止的 PEM 編碼 ANSI 字串形式取得。如果您省略路徑和檔案名稱,則字串會列印到標準輸出。
從命令解譯器的提示字元中,叫用任何 MySQL 用戶端程式來建立與相同伺服器的新加密連線。若要重複使用會話資料,請指定
--ssl-session-data
命令列選項和檔案引數。例如,使用 mysql 建立新的連線:
mysql -u admin -p --ssl-session-data=~/private-dir/session.txt
然後使用 mysqlshow 用戶端:
mysqlshow -u admin -p --ssl-session-data=~/private-dir/session.txt Enter password: ***** +--------------------+ | Databases | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | world | +--------------------+
在每個範例中,用戶端都會嘗試在與相同伺服器建立新連線時恢復原始會話。
若要確認 mysql 是否重複使用了會話,請查看
status
命令的輸出。如果目前活動的 mysql 連線確實恢復了會話,則狀態資訊會包含SSL session reused: true
。
除了 mysql 和 mysqlshow 之外,SSL 會話重複使用也適用於 mysqladmin、mysqlbinlog、mysqlcheck、mysqldump、mysqlimport、mysqlslap、mysqltest、mysql_migrate_keyring 和 mysql_secure_installation。
有幾個條件可能會阻止成功擷取會話資料。例如,如果會話未完全連線、它不是 SSL 會話、伺服器尚未傳送會話資料,或者 SSL 會話根本無法重複使用。即使會話資料已正確儲存,伺服器的會話快取也可能會逾時。無論原因為何,如果您指定 --ssl-session-data
但無法重複使用會話,則預設會傳回錯誤。例如:
mysqlshow -u admin -p --ssl-session-data=~/private-dir/session.txt
Enter password: *****
ERROR:
--ssl-session-data specified but the session was not reused.
若要抑制錯誤訊息,並改為靜默建立新的會話來建立連線,請在命令列中指定 --ssl-session-data-continue-on-failed-reuse
,以及 --ssl-session-data
。如果伺服器的快取逾時已過期,您可以再次將會話資料儲存到相同的檔案。可以延長預設的伺服器快取逾時 (請參閱 SSL 會話重複使用的伺服器端執行階段設定和監視)。