提高SSL握手性能

时间:2010-11-22 13:58:04

标签: c++ c openssl

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

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

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

所以,我有几个问题,

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

4 个答案:

答案 0 :(得分:3)

您应该能够安全地使用会话缓存(OpenSSL支持哪些),请参阅SSL_CTX_set_session_cache_modeSSL_set_sessionSSL_session_reused上的文档,以获取有关如何实现此目标的更多信息。< / p>

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

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

您可以抽象出连接逻辑,这样您的客户端代码仍然认为正在进行连接/处理/断开连接。

答案 3 :(得分:2)

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

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

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