如何在openssl中获取错误字符串?

15

我正在使用openssl与远程服务器建立TLS连接。

以下是代码片段:

if ((ret = SSL_connect(c->ssl)) <= 0) {
    ret = SSL_get_error(c->ssl, ret);
    if((err = ERR_get_error())) {
        SSL_load_error_strings();
        ERR_load_crypto_strings();
        CRERROR(LOGSSLUTILS, "SSL connect err code:[%lu](%s)\n", err, ERR_error_string(err, NULL));
        CRERROR(LOGSSLUTILS, "Error is %s \n",ERR_reason_error_string(err));
    }
}

由于某些未知原因,ssl_connect 失败了,我想使用 ERR_error_string 来查找失败的原因,输出如下:

SSL connect err code:[336077172] (error:14082174:lib(20):func(130):reason(372))

Error: cmrSSLlInit:174 Error is (null) 

正如您所见,我只能获取错误代码,但无法获取可读的错误字符串。

那么我该如何获取可读的错误字符串?

5个回答

10
由于某些未知原因,ssl_connect 失败了,我只想通过使用 ERR_error_string 来识别失败原因,输出结果如下:

对于某些未知的原因,ssl_connect 失败了,我只是想用 ERR_error_string 确定失败的原因,输出如下:

SSL connect err code:[336077172] (error:14082174:lib(20):func(130):reason(372))
$ openssl errstr 0x14082174
error:14082174:SSL routines:ssl3_check_cert_and_algorithm:dh key too small
< p>对于DH key too small,请在Stack Overflow上查看SSL操作失败,错误代码为1:dh key too small。简而言之,早期版本的OpenSSL使用了512位的DH组,这太小了,您需要使用2048位的组。


如何获得可读的错误字符串?

要记录像error:14082174:SSL routines:ssl3_check_cert_and_algorithm:dh key too small这样的字符串,我相信可以调用err_print_errorsERR_print_errors_fp函数。这些函数会打印整个错误堆栈。另请参阅ERR_print_errors手册页面


8
通过以下代码片段可以获取所有排队的线程本地错误,这是根据此处建议的 链接
string getOpenSSLError()
{
    BIO *bio = BIO_new(BIO_s_mem());
    ERR_print_errors(bio);
    char *buf;
    size_t len = BIO_get_mem_data(bio, &buf);
    string ret(buf, len);
    BIO_free(bio);
    return ret;
}

谢谢!正是我所需要的。 - george_ptr

4
我用这个来打印最新的错误。
ctx = SSL_CTX_new(method);
if(ctx == NULL)
{
    printf("%s", ERR_error_string(ERR_get_error(), NULL));
}

3

您在样例代码中调用SSL_load_error_strings()ERR_load_crypto_strings()时机过晚。它们应该在程序开头立即被调用,这样您就可以从OpenSSL中得到可读的错误字符串。 @jww关于DH组太小是正确的。理想情况下,服务器需要重新配置更大的组。如果不可能,则尝试使用非DHE密码套件连接(即使用基于ECDHE的密码套件代替)。


2
这是因为我在编译openssl时包含了"no-err"选项,所以Err_error_string返回NULL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接