首页 文章

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

提问于
浏览
8

我们有一个多线程网络应用程序已使用套接字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

  • 对错 . OpenSSL连接API调用(SSL_Read,SSL_Write等)可以在同一个SSL实例(SSL_new调用返回的SSL指针)上并发执行?

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

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

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

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

2 回答

  • 14

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

    • False. No, you cannot use SSL_read / SSL_write concurrently on the same SSL instance.*

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

    • Same answer as above. With or Without SSL_MODE_AUTO_RETRY, you cannot use the same SSL instance X concurrently to do SSL_read and SSL_write parallelly*

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

    True. If no concurrent execution is there, then OpenSSL works fine for Blocking as well as Non-Blocking Sockets.

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

    False. The SSL instance is not bound to any thread by OpenSSL itself. You can use the SSL instance created in one thread in another thread as long as only one thread is using a single SSL instance at any one point of time.

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

    False. Both Thread A and Thread B can use the same SSL instance X, as long both don't do concurrent operations on SSL instance X.

  • 0

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

相关问题