MySQL 客户端程序可能会选择恢复先前的 SSL 会话,前提是服务器在其运行时缓存中具有该会话。本节描述了有利于 SSL 会话重用的条件、服务器变量用于管理和监控会话缓存,以及客户端命令行选项用于存储和重用会话数据。
每个完整的 TLS 交换都可能具有计算和网络开销成本,使用 TLSv1.3 可以减少成本。通过从已建立的会话中提取会话票据,然后在建立下一个连接时提交该票据,可以减少总成本。例如,考虑拥有可以快速打开多个连接的网页的好处。
一般来说,以下条件必须满足以便 SSL 会话可以被重用:
-
服务器必须在内存中保持会话缓存。
-
服务器端会话缓存超时不得已过期。
-
每个客户端都必须维护活动会话的缓存并将其保持安全。
C 应用程序可以使用 C API 功能来启用加密连接的会话重用(参见 SSL 会话重用)。
要创建初始 TLS 上下文,服务器使用启动时的上下文相关系统变量的值。为了公开上下文值,服务器还初始化了一组对应的状态变量。下表显示了定义服务器运行时会话缓存的系统变量和对应的状态变量,用于公开当前活动的会话缓存值。
表 8.15 会话重用系统变量和状态变量
System Variable Name | Corresponding Status Variable Name |
---|---|
ssl_session_cache_mode |
Ssl_session_cache_mode |
ssl_session_cache_timeout |
Ssl_session_cache_timeout |
当 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.3服务器的加密连接。
-
使用ssl_session_data_print命令指定文件路径,以安全地存储当前活动的会话数据。例如:
mysql> ssl_session_data_print ~/private-dir/session.txt
会话数据将以null-terminated、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是否重用了会话,请查看状态命令的输出。如果当前活动的mysql连接恢复了会话,状态信息将包括
SSL会话重用:true
。
除了mysql和mysqlshow,SSL会话重用也适用于mysqladmin、mysqlbinlog、mysqlcheck、mysqldump、mysqlimport、mysqlpump、mysqlslap、mysqltest、mysql_migrate_keyring、mysql_secure_installation和mysql_upgrade。
可能有多种情况会阻止成功检索会话数据。例如,如果会话尚未完全连接、不是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 会话重用服务器端运行时配置和监控)。