文档首页
MySQL 8.4 参考手册
相关文档 下载本手册

MySQL 8.4 参考手册  /  ...  /  重用 SSL 会话

8.3.5 重用 SSL 会话

如果服务器的运行时缓存中存在会话,则 MySQL 客户端程序可以选择恢复之前的 SSL 会话。本节介绍有利于 SSL 会话重用的条件、用于管理和监视会话缓存的服务器变量,以及用于存储和重用会话数据的客户端命令行选项。

每次完整的 TLS 交换在计算和网络开销方面都可能成本高昂,如果使用 TLSv1.3,则成本较低。通过从已建立的会话中提取会话票证,然后在建立下一个连接时提交该票证,如果可以重用会话,则可以降低总体成本。例如,考虑能够打开多个连接并更快生成的网页的好处。

通常,在可以重用 SSL 会话之前,必须满足以下条件

  • 服务器必须将其会话缓存保存在内存中。

  • 服务器端会话缓存超时不得已过期。

  • 每个客户端都必须维护活动会话的缓存并确保其安全。

C 应用程序可以使用 C API 功能为加密连接启用会话重用(请参阅 SSL 会话重用)。

SSL 会话重用的服务器端运行时配置和监视

为了创建初始 TLS 上下文,服务器使用上下文相关系统变量在启动时的值。为了公开上下文值,服务器还会初始化一组相应的status 变量。下表显示了定义服务器运行时会话缓存的系统变量,以及公开当前活动的会话缓存值的相应状态变量。

表 8.14 用于会话重用的系统和状态变量


注意

ssl_session_cache_mode 服务器变量的值为 ON(默认模式)时,Ssl_session_cache_mode 状态变量的值为 SERVER

SSL 会话缓存变量适用于 mysql_mainmysql_admin TLS 通道。它们的值还会作为性能模式 tls_channel_status 表中的属性公开,以及任何其他活动 TLS 上下文的属性。

要在运行时重新配置 SSL 会话缓存,请使用以下步骤

  1. 将应更改的每个与缓存相关的系统变量设置为其新值。例如,将缓存超时值从默认值(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)

    有关设置变量值的更多信息,请参阅 系统变量赋值

  2. 执行 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 上下文。现有连接不受影响。

SSL 会话重用的客户端配置

所有 MySQL 客户端程序都能够为到同一服务器的新建加密连接重用之前的会话,前提是在原始连接仍处于活动状态时存储了会话数据。会话数据存储到文件中,并在再次调用客户端时指定此文件。

要存储和重用 SSL 会话数据,请使用以下步骤

  1. 调用 mysql 以建立到运行 MySQL 8.4 的服务器的加密连接。

  2. 使用 ssl_session_data_print 命令指定文件的路径,您可以在其中安全地存储当前活动的会话数据。例如

    mysql> ssl_session_data_print ~/private-dir/session.txt

    会话数据以空终止、PEM 编码的 ANSI 字符串的形式获取。如果省略路径和文件名,则字符串将打印到标准输出。

  3. 在命令解释器的提示符下,调用任何 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

除了 mysqlmysqlshow 之外,SSL 会话重用还适用于 mysqladminmysqlbinlogmysqlcheckmysqldumpmysqlimportmysqlslapmysqltestmysql_migrate_keyringmysql_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 会话重用的服务器端运行时配置和监控)。