【发布时间】:2014-05-10 07:10:35
【问题描述】:
我需要创建一个可以直接读取/写入握手数据的 OpenSSL 连接。原因是握手数据将在 UDP 连接中传输(DTLS 不是一个选项,因为数据不是直接在数据报中,而是在另一个协议数据包中,EAP 如果你好奇的话)。到目前为止,我已经创建了一个 OpenSSL 连接,但我什至无法读取客户端的握手以发送到服务器。
在我的研究中,我发现我需要一个 Memory BIO 来读取/写入连接,但无法弄清楚如何提取握手数据。以下是我初始化 client 连接的方法:
SSL_library_init();
SSL_load_error_strings();
OpenSSL_add_all_algorithms();
ctx = SSL_CTX_new(SSLv3_client_method());
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
ssl = SSL_new(ctx);
rbio = BIO_new(BIO_s_mem());
wbio = BIO_new(BIO_s_mem());
SSL_set_bio(ssl, rbio, wbio);
SSL_set_connect_state(ssl);
我尝试过 doint SSL_connect 来启动握手:
int ret = SSL_connect(ssl);
但返回-1,然后执行SSL_get_error(ssl, res),我得到一个错误代码2,然后我用该代码执行ERR_error_string并得到:
error:00000002:lib(0):func(0):system lib
另外,如果我使用 SSL_do_handshake 而不是 SSL_connect 我会得到完全相同的错误。
我已经能够通过 TCP 设置 OpenSSL 连接,但从未使用内存 BIO 进行过此操作,因此非常感谢您提供任何帮助。谢谢!
【问题讨论】:
-
请参阅Alternative Interface that doesn't use Sockets? 上的 Henson 博士的回答,另请参阅 openssl bio "shared memory"。