我正在尝试从服务器端调试 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 的期望是否错误? 它不会将错误放入堆栈吗? 如果没有,我该如何获取有关握手问题的详细信息?
(注意:如果握手没有失败,所有代码都可以正常工作。)
问题在于 OpenSSL 1.0.2 在 BIO_do_handshake 期间似乎无法正确地将错误事件放入堆栈。 使用 OpenSSL 1.1.1 的相同代码会获得非零错误堆栈并正确记录错误。