0

我有一个包装 OpenSSL 的异步客户端和服务器应用程序。一旦创建,它们分别调用 SSL_set_connect_state()/SSL_set_accept_state() 来初始化它们的内部状态。到目前为止,一切都按应有的方式运行。我假设一旦设置了上述状态,就可以开始握手了。我执行以下操作来初始化所说的握手(片段):

if (BIO_ctrl_pending(m_pOutBio))
{
    size_t iNumBytes = BIO_ctrl_pending(m_pOutBio);
    if (iNumBytes > 0)
    {
        CAutoPtr<byte> tTempBuf(new byte[iNumBytes]);

        // Transfer bytes from the Write BIO into the temporary buffer
        int iRet = BIO_read(m_pOutBio, tTempBuf, iNumBytes);
    }
}

这就是有趣的地方。BIO_ctrl_pending() 调用失败,当我对其执行 SSL_get_error() 时,它返回 SSL_ERROR_WANT_READ。然后它显然不会执行我的阅读代码。我在代码片段上方添加了以下行:

SSL_peek(m_pSSLCon, NULL, 0);

现在,当我运行代码时,BIO_ctrl_pending() 返回适当的数量 (210),然后我的代码可以继续从 BIO 读取并启动握手。

我的问题是,这是 OpenSSL 中没有正确设置状态的某种错误吗?还是我错过了什么?

4

1 回答 1

3

老问题,但在谷歌搜索 openssl 内容时不断弹出,供参考:

只需启动握手,而不是依赖 peek/read 在内部进行:如果它不是套接字生物,握手将失败并显示 ssl_error_want_read 然后您使用 ctrl_pending 来获取要读取的大小。

像这样的东西:

    ret = SSL_do_handshake(client_side);
      if (ret < 0)
        if (SSL_ERROR_WANT_READ !=  SSL_get_error(client_side,ret))
            cout << "ERROR";


    ret = BIO_ctrl_pending(network_side); 
于 2012-02-20T15:17:17.437 回答