文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  重用 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 9.0 的服务器的加密连接。

  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 会话重用的服务器端运行时配置和监控)。