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

buz*_*791 8 concurrency ssl multithreading 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,则最终会发生故障?

Jay*_*Jay 15

1.真或假.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上执行并发操作.