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 通道。它們的值也會作為效能架構 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 9.0 之伺服器的加密連線。
使用 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 工作階段重用的伺服器端執行階段設定和監控)。