我正在使用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)
如您所见,我只能获取错误代码但无法获取可读错误字符串。
如何获取可读错误字符串?
答案 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_errors
和ERR_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;
}