【问题标题】:Increasing SSL handshaking performance提高 SSL 握手性能
【发布时间】:2010-11-22 13:58:04
【问题描述】:

我有一个短暂的客户端进程,它通过 SSL 与服务器通信。该过程被频繁调用,并且只运行很短的时间(通常不到 1 秒)。此过程旨在用作用于执行较大任务的 shell 脚本的一部分,并且可能会被非常频繁地调用。

它每次启动时执行的 SSL 握手在我的测试中显示为一个重要的性能瓶颈,如果可能的话,我想减少这种情况。

想到的一件事是获取会话 ID 并将其存储在某个地方(有点像 cookie),然后在下一次调用时重新使用它,但这让我感到不安,因为我认为会有这样做的一些安全问题。

所以,我有几个问题,

  1. 这是个坏主意吗?
  2. 这甚至可以使用 OpenSSL 实现吗?
  3. 有没有更好的方法来加快 SSL 握手过程?

【问题讨论】:

    标签: c++ c openssl


    【解决方案1】:

    握手后,您可以从与SSL_get_session() 的连接中获取 SSL 会话信息。然后您可以使用i2d_SSL_SESSION() 将其序列化为可以写入磁盘的形式。

    当您下次想连接到同一台服务器时,您可以从磁盘加载会话信息,然后使用d2i_SSL_SESSION() 对其进行反序列化并使用SSL_set_session() 进行设置(在SSL_connect() 之前)。

    磁盘上的 SSL 会话应该只有运行该工具的用户才能读取,并且应该经常覆盖和删除陈旧的会话。

    【讨论】:

      【解决方案2】:

      您应该能够安全地使用会话缓存(OpenSSL 支持),请参阅SSL_CTX_set_session_cache_modeSSL_set_sessionSSL_session_reused 上的文档以了解有关如何实现此目的的更多信息。

      【讨论】:

        【解决方案3】:

        您是否可以使用持久连接,因此设置是一次性成本?

        您可以抽象出连接逻辑,以便您的客户端代码仍然认为它正在执行连接/处理/断开循环。

        【讨论】:

          【解决方案4】:

          有趣的是,我今天遇到了 OpenSSL 握手问题。 RAND_poll 在 Windows 上的实现使用 Windows 堆 API 作为随机熵的来源。

          不幸的是,由于 Windows 7(和 Server 2008)中的“错误修复”,堆枚举 API(毕竟是调试 API)现在可以在堆充满分配时每次调用占用一秒钟。这意味着 SSL 连接和接受可能需要 1 秒到几分钟不等的时间。

          The Ticket 包含一些关于如何修补 openssl 以实现 FAR 更快握手的好建议。

          【讨论】:

            猜你喜欢
            • 2023-04-02
            • 2016-02-06
            • 1970-01-01
            • 2012-08-11
            • 1970-01-01
            • 2018-07-28
            • 2011-04-16
            • 2017-02-11
            相关资源
            最近更新 更多