澄清OpenSSL 0.9.8L并发支持 - 如果非并发完成,多个线程可以使用SSL实例吗?

时间:2013-01-22 20:43:06

标签: multithreading ssl concurrency openssl

我们有一个多线程网络应用程序已使用套接字10年,现在我们正在尝试使用OpenSSL 0.9.8L来保护应用程序。多年来,应用程序的网络协议被设计为利用单个套接字连接的双工特性;应用程序在同一个套接字上同时读写。应用程序管理底层套接字本身,并通过SSL_set_fd将套接字描述符传递给OpenSSL。

我们为多线程支持配置了OpenSSL,设置了静态和动态锁定回调,例如: CRYPTO_set_id_callback(),CRYPTO_set_locking_callback()等。在大多数情况下,应用程序运行良好,但我们看到一些异常。为了帮助我们确定原因,对几个问题的明确答案会有所帮助。

OpenSSL常见问题解答页面指出OpenSSL是线程安全的,但认为单个“SSL连接可能不会被多个线程同时使用。”

http://www.openssl.org/support/faq.html#PROG1

  1. 对错。 OpenSSL连接API调用(SSL_Read,SSL_Write等)可以在同一个SSL实例上同时执行(SSL_new调用返回的SSL指针)?
  2. 对错。对于阻塞启用了SSL_MODE_AUTO_RETRY的套接字,线程A可以在SSL实例X上调用SSL_Read(),而线程B在SSL实例X上同时调用SSL_Write()?
  3. 对错。当应用程序使用非阻塞套接字并且防止在同一SSL实例上并发执行SSL_Read和SSL_Write(以及其他连接API调用)时,OpenSSL无错误地工作?
  4. 对错。 SSL_new返回的OpenSSL SSL实例绑定到名为SSL_new的单个线程;绑定意味着SSL实例可能不与任何其他线程共享,SSL实例仅在调用SSL_new的线程上使用?
  5. 对错。如果线程A i)调用SSL_new,则获取SSL实例X,并且ii)使用SSL实例X调用SSL_Read。如果线程B使用相同的SSL实例X非并发地调用SSL_Read / SSL_Write,则最终会发生故障?

2 个答案:

答案 0 :(得分:14)

1.True或False。 OpenSSL连接API调用(SSL_Read,SSL_Write等)可以在同一个SSL实例上同时执行(SSL_new调用返回的SSL指针)?

*的假。不,您不能在同一个SSL实例上同时使用SSL_read / SSL_write。*

2.True或False。对于阻塞启用了SSL_MODE_AUTO_RETRY的套接字,线程A可以在SSL实例X上调用SSL_Read(),而线程B在SSL实例X上同时调用SSL_Write()?

* 与上述答案相同。使用或不使用SSL_MODE_AUTO_RETRY时,您不能同时使用相同的SSL实例X来并行执行SSL_read和SSL_write *

3.True或False。当应用程序使用非阻塞套接字并且防止在同一SSL实例上并发执行SSL_Read和SSL_Write(以及其他连接API调用)时,OpenSSL无错误地工作?

真。如果没有并发执行,那么OpenSSL适用于阻塞和非阻塞套接字。

4.True或False。 SSL_new返回的OpenSSL SSL实例绑定到名为SSL_new的单个线程;绑定意味着SSL实例可能不与任何其他线程共享,SSL实例仅在调用SSL_new的线程上使用?

假。 OpenSSL本身并未将SSL实例绑定到任何线程。只要一个线程在任何一个时间点使用单个SSL实例,您就可以使用在另一个线程中的一个线程中创建的SSL实例。

5.True或False。如果线程A i)调用SSL_new,则获取SSL实例X,ii)使用SSL实例X调用SSL_Read。如果线程B使用相同的SSL实例X非并发地调用SSL_Read / SSL_Write,则最终会发生故障?

假。线程A和线程B都可以使用相同的SSL实例X,只要它们都不在SSL实例X上执行并发操作。

答案 1 :(得分:0)

实验上,如果SSL连接已经通过了negociation阶段,并且之后没有重新协商,那么同时使用SSL_read和SSL_write就不会造成任何伤害。 根据我的测试,我将OpenSSL与Push Framework集成,后者是一个多线程网络库。 但是,在我们阅读的任何地方,OpenSSL专业人员都坚持认为多个线程不能同时使用相同的上下文。