c++ - 将类方法设置为 OpenSSL 回调

标签 c++ openssl

我正在编写一个使用 OpenSSL 处理加密相关工作的类。如何为 PSK 相关回调指定类的方法?

SSL_set_psk_find_session_callbackSSL_set_psk_use_session_callback

已尝试 std::bind,但出现编译错误:

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

Error C2664 'void SSL_set_psk_find_session_callback(SSL *,SSL_psk_find_session_cb_func)': cannot convert argument 2 from 'std::_Binder' to 'SSL_psk_find_session_cb_func'

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

最佳答案

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

您不能指定类实例以用于通过 OpenSSL 接口(interface)进行实例方法调用 - 它严格是 C 而不是 C++。

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

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

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

关于c++ - 将类方法设置为 OpenSSL 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59160457/

相关文章:

java - openssl_加密 aes 256 与 java 中的哈希

android - 通过WinSock2 Api的 "recv()"函数调用单次调用获取全部接收字节

linux - 静态链接的openssl,从哪里加载CA证书?

ssl - 为 SNI Rust Web 服务器实现多个 TLS 证书和私钥的正确方法是什么?

openssl - 苹果为何在MacOS 10.7(Lion)中弃用OpenSSL?

tomcat - play framework 上的 ssl 证书安装

c++ - Visual Studio 2013 Professional 链接器错误

c++ - QThreadPool调用父类QRunnable的纯虚函数

c++ - 混淆内联函数的问题

c++ - munmap_chunk() : invalid pointer when using function templates