OpenSSL BIO_do_handshake 不会在堆栈上放置任何错误

问题描述 投票:0回答:1

我正在尝试从服务器端调试 TLS 握手问题。 客户端在 Client Hello 数据包中发送了服务器不喜欢的内容,我正在尝试找出它是什么。

在设置上下文、设置选项、加载服务器证书等之后,代码从上下文创建一个 BIO 对象。 之后,它调用BIO_do_handshake来执行握手。 BIO_do_handshake 返回-1,表示错误。 但是当我之后立即调用 ERR_get_error 时,它返回 0,这意味着堆栈上没有错误代码。

这是代码。 (目前使用 OpenSSL 1.0.2 API。)

long
perform_handshake(BIO *bio)
{
    long rc;

    do {
        rc = BIO_do_handshake(bio);
        if (rc <= 0) {
            unsigned long errcode;
            char *errstr;

            syslog(LOG_ERR, "BIO_do_handshake returned %d\n", rc);

            while (errcode = ERR_get_error()) {
                errstr = ERR_error_string(errcode, NULL);
                syslog(LOG_ERR, "%s\n", errstr);
            }
        }
    } while (rc <= 0 && BIO_should_retry(bio));

    return rc;
}

我在系统日志输出中收到消息“BIO_do_handshake returned -1”,但没有错误字符串。

我对 BIO_do_handshake 的期望是否错误? 它不会将错误放入堆栈吗? 如果没有,我该如何获取有关握手问题的详细信息?

(注意:如果握手没有失败,所有代码都可以正常工作。)

c ssl openssl handshake
1个回答
0
投票

问题在于 OpenSSL 1.0.2 在 BIO_do_handshake 期间似乎无法正确地将错误事件放入堆栈。 使用 OpenSSL 1.1.1 的相同代码会获得非零错误堆栈并正确记录错误。

© www.soinside.com 2019 - 2024. All rights reserved.