在多个线程之间共享单个X509_STORE以验证证书是否安全?

时间:2016-11-01 22:43:51

标签: c multithreading openssl

用例:我希望在网络线程中接受并提供连接,并将所有证书检查委托给另一个线程(甚至是线程池)。要检查的所有证书的CA存储在单个X509_STORE中。基本上,当从客户端收到证书时,我创建新的X509_STORE_CTX,使用单个(例如,全局)X509_STORE初始化它,并使用调用{{1}的检查例程来提供工作线程。 }。

问题是,X509_verify_cert的这种线程共享是否需要应用程序提供的任何外部锁定?

特别是,我很担心,因为X509_STORE采用了X509_STORE_CTX_init的非常量指针。可能这是因为此函数修改了商店内的引用计数器,如果在库初始化期间设置了锁定回调,则该引用计数器是线程安全的。应该没有其他非const访问商店,对吗?

1 个答案:

答案 0 :(得分:2)

  

在多个线程之间共享单个X509_STORE以验证证书是否安全?

是的,但附有字符串。是的,因为OpenSSL为商店提供锁定:

openssl-1.0.2h$ grep -IR CRYPTO_LOCK * | grep STORE
crypto/crypto.h:# define CRYPTO_LOCK_X509_STORE          11
crypto/crypto.h:# define CRYPTO_LOCK_STORE               37
crypto/x509/by_dir.c:            CRYPTO_r_lock(CRYPTO_LOCK_X509_STORE);
crypto/x509/by_dir.c:            CRYPTO_r_unlock(CRYPTO_LOCK_X509_STORE);
crypto/x509/by_dir.c:        CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE);
crypto/x509/by_dir.c:        CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE);
...

但是,“附加的字符串”是您需要手动安装锁,这可能是非常重要的。另见: