我有一个短暂的客户端进程,通过SSL与服务器通信。该过程经常被调用,并且仅运行很短的时间(通常少于1秒)。此过程旨在用作执行较大任务的shell脚本的一部分,并且可能会经常调用。
每次启动时它执行的SSL握手在我的测试中显示为一个重要的性能瓶颈,如果可能的话我想减少它。
我想到的一件事是获取会话ID并将其存储在某个地方(有点像cookie),然后在下次调用时重新使用它,但这让我感到不安,因为我认为会有这样做的一些安全问题。
所以,我有几个问题,
答案 0 :(得分:3)
您应该能够安全地使用会话缓存(OpenSSL支持哪些),请参阅SSL_CTX_set_session_cache_mode,SSL_set_session和SSL_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以实现远远更快的握手的好建议。