如果服务器的运行时缓存中存在会话,则 MySQL 客户端程序可以选择恢复之前的 SSL 会话。本节介绍有利于 SSL 会话重用的条件、用于管理和监视会话缓存的服务器变量,以及用于存储和重用会话数据的客户端命令行选项。
每次完整的 TLS 交换在计算和网络开销方面都可能成本高昂,如果使用 TLSv1.3,则成本较低。通过从已建立的会话中提取会话票证,然后在建立下一个连接时提交该票证,如果可以重用会话,则可以降低总体成本。例如,考虑能够打开多个连接并更快生成的网页的好处。
通常,在可以重用 SSL 会话之前,必须满足以下条件
服务器必须将其会话缓存保存在内存中。
服务器端会话缓存超时不得已过期。
每个客户端都必须维护活动会话的缓存并确保其安全。
C 应用程序可以使用 C API 功能为加密连接启用会话重用(请参阅 SSL 会话重用)。
为了创建初始 TLS 上下文,服务器使用上下文相关系统变量在启动时的值。为了公开上下文值,服务器还会初始化一组相应的status 变量。下表显示了定义服务器运行时会话缓存的系统变量,以及公开当前活动的会话缓存值的相应状态变量。
当 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 8.4 的服务器的加密连接。
使用 ssl_session_data_print 命令指定文件的路径,您可以在其中安全地存储当前活动的会话数据。例如
mysql> ssl_session_data_print ~/private-dir/session.txt
会话数据以空终止、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 会话重用的服务器端运行时配置和监控)。