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

时间:2017-02-08 06:40:26

标签: ssl openssl tls1.2

我正在使用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 个答案:

答案 0 :(得分:3)

  

由于某种未知原因,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

对于 DH key too small ,请在Stack Overflow上结帐SSL operation failed with code 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 man pages

答案 1 :(得分:3)

您在示例代码中调用echo|的时间太晚了。应该在程序开始时调用它们 - 然后应该从OpenSSL中获取可读的错误字符串。 @jww说DH组太小了。理想情况下,服务器需要使用更大的组进行重新配置。如果无法做到这一点,请尝试连接非DHE密码套件(即使用基于ECDHE的密码套件)

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我用它来打印最新的错误

ctx = SSL_CTX_new(method);
if(ctx == NULL)
{
    printf("%s", ERR_error_string(ERR_get_error(), NULL));
}

答案 4 :(得分:0)

获取所有排队的线程本地错误的一种方法是使用下面的代码段,如建议的here

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;
}