将类方法设置为OpenSSL回调

时间:2019-12-03 15:31:59

标签: c++ openssl

我正在编写一个类,负责使用OpenSSL进行与加密有关的工作。如何为PSK相关的回调指定类的方法?

SSL_set_psk_find_session_callback SSL_set_psk_use_session_callback

尝试了std :: bind,但是出现了编译器错误:

SSL_set_psk_find_session_callback(ssl, bind(&OpenSslHandler::psk_find_session_cb, this));
  

错误C2664'无效SSL_set_psk_find_session_callback(SSL   *,SSL_psk_find_session_cb_func)':无法将参数2从'std :: _ Binder'转换为'SSL_psk_find_session_cb_func'

编辑:有多个从多个线程调用的OpenSSLHandler实例-处理同时连接

2 个答案:

答案 0 :(得分:3)

每个连接都有专用于该连接的唯一SSL *。该值将传递给您的回调函数。

您不能指定用于通过OpenSSL接口进行实例方法调用的类实例-严格来说,它是C而不是C ++。

std::map<SSL *,OpenSslHandler *>回调函数中使用extern "C"或类似的数据结构来查找正确的类实例,以用于调用实例方法。只需确保正确地互斥保护您的数据结构即可。

或者,您可以在建立SSL *连接时使用SSL_set_ex_data(),并为该OpenSslHandler *连接设置一个指向OpenSslHandler实例的SSL *指针,然后使用SSL_get_ex_data()检索指针-再次在extern "C"回调函数中。

要使用get / set方法,首先需要通过调用SSL_get_ex_new_index()创建唯一索引。返回的整数索引可以存储在静态类变量中。它在您的应用程序中是唯一的,可以与所有SSL对象一起使用来获取/设置Ex_Data。

答案 1 :(得分:0)

按照惯例,大多数库都允许您将任意用户数据传递给回调,但是这里似乎并非如此。

一些替代方法:

  • 将指针存储在线程局部,全局或静态变量中。仅当程序中只有一个OpenSslHandler
  • 时,后两个才是安全的
  • std::map<SSL_CTX*, OpenSslHandler*>中存储指向SSL_psk_find_session_cb_func的(共享)指针。在您的SSL_CTX中,通过SSL_get_SSL_CTX恢复OpenSslHandler指针,并使用该指针在地图中查找{{1}}。
相关问题