代码之家  ›  专栏  ›  技术社区  ›  Glen

提高SSL握手性能

  •  4
  • Glen  · 技术社区  · 15 年前

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

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

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

    所以,我有几个问题,

    1. 这是个坏主意吗?
    2. 这甚至可以使用OpenSSL吗?
    3. 有没有更好的方法来加速SSL握手过程?
    4 回复  |  直到 15 年前
        1
  •  3
  •   caf    15 年前

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

    下一步要连接到同一个服务器时,可以从磁盘加载会话信息,然后用取消序列化 d2i_SSL_SESSION() 使用 SSL_set_session() 设置它(在 SSL_connect() )

    磁盘上的ssl会话应该只能由运行该工具的用户读取,并且应该经常覆盖和删除过时的会话。

        2
  •  3
  •   Hasturkun    15 年前

    您应该能够安全地使用会话缓存(OpenSSL支持),请参阅 SSL_CTX_set_session_cache_mode , SSL_set_session SSL_session_reused 有关如何实现这一目标的更多信息。

        3
  •  2
  •   pauljwilliams    15 年前

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

    您可以抽象掉连接逻辑,这样您的客户机代码仍然 认为 它执行连接/处理/断开连接循环。

        4
  •  2
  •   Chris Becke    15 年前

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

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

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