【问题标题】:How to disable SSL session resumption on client side completely?如何在客户端完全禁用 SSL 会话恢复?
【发布时间】:2016-09-12 14:47:37
【问题描述】:

我使用的是 OpenSSL 1.0.2g。在我的客户端中,我想完全禁用 SSL 会话恢复(出于测试目的)。

我在连接之前,在创建 SSL_CTX 之后:

SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
SSL_CTX_set_options(ctx, SSL_OP_NO_TICKET);

但我在流量捕获中看到的是,我的客户端总是通过发送非空会话 ID 进行会话重用。并且服务器确实接受它。

如何完全禁用 SSL 会话恢复?

更多扩展代码sn-p:

SSL_CTX *ctx = NULL;
ctx = SSL_CTX_new(SSLv23_client_method()))
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
SSL_CTX_set_options(ctx, SSL_OP_NO_TICKET);
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
SSL_CTX_set_verify_depth(ctx, 0);
SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);

我做错了吗?缺少任何必需的步骤?

【问题讨论】:

  • ldd <your prog> 返回什么?我问的原因是许多 distors 提供 OpenSSL 1.0.1。尽管您正在针对 OpenSSL 1.0.2 进行编译和链接,但在运行时您可能会获得 1.0.1 的低级负载。 OpenSSL 1.01。和 1.0.2 是二进制兼容的,所以你可能永远不会知道其中的区别。

标签: session authentication ssl openssl


【解决方案1】:

您正在设置自动重试:

SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);

根据documentation

SSL_MODE_AUTO_RETRY

如果传输失败,请不要重试应用程序 阻塞。如果在正常运行期间发生重新协商,则 SSL_read 或 SSL_write 将返回 -1 并指示需要 使用 SSL_ERROR_WANT_READ 重试。在非阻塞环境中 应用程序必须准备好处理不完整的读/写 操作。在阻塞环境中,应用程序并不总是 准备处理返回失败的读/写操作 报告。 标志 SSL_MODE_AUTO_RETRY 将导致读/写操作 仅在握手并成功完成后返回

这意味着自动重新协商将以静默方式发生,而使用 OpenSSL 库的应用程序不会意识到这一点。见the documentation for SSL_write():

如果底层 BIO 阻塞,SSL_write() 只会返回一次 写操作已完成或发生错误,除外 当重新协商发生时,在这种情况下 SSL_ERROR_WANT_READ 可能发生。这种行为可以通过控制 SSL_CTX_set_mode 调用的 SSL_MODE_AUTO_RETRY 标志。

这种“沉默”的重新谈判可能解释了您观察到的行为,如果是这样,不使用SSL_MODE_AUTO_RETRY 可能会解决您的问题。

OpenSSL 是一个极其复杂的工具,在我看来,许多选项的行为记录不充分。对于一个非常相关的示例,“可以使用 SSL_CTX_set_mode 调用的 SSL_MODE_AUTO_RETRY 标志控制此行为。”控制如何暗示使用SSL_MODE_AUTO_RETRY 允许静默重新协商和会话重用,但从未明确说明。

同样,the many options for SSL_CTX_set_session_cache_mode() 之一可能是相关的:

为了重用会话,客户端必须将会话的 id 发送到 服务器。它只能发送一个 id。然后服务器要么 同意重用会话或开始一个完整的握手(创建一个 新会话)。

服务器将在其内部会话存储中查找会话。 如果在内部存储中找不到会话或查找 内部存储已停用 (SSL_SESS_CACHE_NO_INTERNAL_LOOKUP),服务器将尝试外部 存储(如果有)。

是的

SSL_SESS_CACHE_OFF

没有为客户端或服务器进行会话缓存。

禁用内部缓存?对我来说,这意味着它没有

【讨论】:

  • 这与会话恢复有什么关系?
  • @EJP - 我链接的文档意味着会话的静默重新协商,因此可能导致 OP 的会话重用。见openssl.org/docs/manmaster/ssl/SSL_write.html
  • @AndrewHenle - 良好的观察力。您可能应该在答案中说明两者之间的联系,因为它并不明显。它还可以避免未来的反对票;并且有人可能会撤回他们的反对票。
【解决方案2】:

我做错了吗?

我认为您在查看流量时一定做错了什么,或者您没有显示代码的重要部分。默认情况下,客户端根本不会恢复任何会话,因为它不知道应该恢复哪个会话。来自SSL_CTX_set_session_cache_mode的文档:

SSL_SESS_CACHE_CLIENT
... 由于 OpenSSL 库没有可靠的方法来知道是否应该重用会话或选择哪个会话(由于抽象 BIO 层,SSL 引擎没有有关连接的详细信息),应用程序必须使用 SSL_set_session 函数选择要重用的会话...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2023-03-19
    • 2011-12-13
    • 1970-01-01
    • 2011-07-12
    • 2021-06-04
    相关资源
    最近更新 更多