Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Reusing SSL Sessions

8.3.5 重用 SSL 会话

MySQL 客户端程序可能会选择恢复之前的 SSL 会话,假设服务器已经将会话保存在其运行时缓存中。这一节描述了 SSL 会话重用适宜的条件、服务器变量用于管理和监控会话缓存,以及客户端命令行选项用于存储和重用会话数据。

每个完整的 TLS 交换操作都可以在计算和网络开销方面具有成本,使用 TLSv1.3 可以减少成本。通过从已建立的会话中提取会话票据,然后在建立下一个连接时提交该票据,可以减少总成本。如果可以重用会话,例如,可以考虑到具有多个连接的网页可以更快地打开。

在总体上,以下条件必须满足才能重用 SSL 会话:

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

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

  • 每个客户端都需要维护一个活动会话缓存并将其保持安全。

C 应用程序可以使用 C API 能力来启用加密连接的会话重用(见SSL 会话重用)。

为了创建初始 TLS 上下文,服务器使用了启动时的上下文相关系统变量的值。为了暴露上下文值,服务器还初始化了相应的状态变量。以下表格显示了服务器的运行时会话缓存和相应的状态变量,暴露当前活动会话缓存值。

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


Note

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

SSL会话缓存变量适用于mysql_mainmysql_admin TLS通道。它们的值也在性能_schematls_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)

    有关设置变量值的详细信息,请见System Variable Assignment

  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上下文。现有连接保持不变。

所有MySQL客户端程序都可以重用先前的会话来建立新的加密连接到同一个服务器,提供了您在原始连接仍然活动时存储会话数据。会话数据存储到文件,您在下次调用客户端时指定该文件。

要存储和重用SSL会话数据,请按照以下步骤进行:

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

  2. 使用ssl_session_data_print命令指定将当前活动会话数据存储到文件的路径。例如:

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

    会话数据以null-terminated,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.

要忽略错误消息,并在 silence 创建新的会话,而不是重新使用会话,请在命令行指定--ssl-session-data-continue-on-failed-reuse,并且--ssl-session-data。如果服务器的缓存超时已经过期,您可以将会话数据存储到同一个文件中。服务器的默认缓存超时可以延长(见Server-Side Runtime Configuration and Monitoring for SSL Session Reuse)。