C OpenSSL错误处理
这是在OpenSSL中进行错误处理的正确方法吗?C OpenSSL错误处理,c,error-handling,openssl,C,Error Handling,Openssl,这是在OpenSSL中进行错误处理的正确方法吗? SSL\u get\u error和ERR\u get\u error之间有什么区别? 文件在这方面相当含糊 int ssl_shutdown(SSL *ssl_connection) { int rv, err; ERR_clear_error(); rv = SSL_shutdown(ssl_connection); if (rv == 0) SSL_shutdown(ssl_connecti
SSL\u get\u error
和ERR\u get\u error
之间有什么区别?
文件在这方面相当含糊
int ssl_shutdown(SSL *ssl_connection)
{
int rv, err;
ERR_clear_error();
rv = SSL_shutdown(ssl_connection);
if (rv == 0)
SSL_shutdown(ssl_connection);
if (rv < 0)
{
err = SSL_get_error(ssl_connection, rv);
if (err == SSL_ERROR_SSL)
fprintf(stderr, "%s\n", ERR_error_string(ERR_get_error(), NULL));
fprintf(stderr, "%s\n", SSL_state_string(ssl_connection));
return 1;
}
SSL_free(ssl_connection);
return 0;
}
intssl\u关闭(ssl*ssl\u连接)
{
int-rv,err;
ERR_clear_error();
rv=SSL\U关闭(SSL\U连接);
如果(rv==0)
SSL_关闭(SSL_连接);
如果(rv<0)
{
err=SSL\u get\u错误(SSL\u连接,rv);
if(err==SSL\u ERROR\u SSL)
fprintf(stderr,“%s\n”,ERR_error_字符串(ERR_get_error(),NULL));
fprintf(stderr,“%s\n”,SSL_状态_字符串(SSL_连接));
返回1;
}
无SSL_(SSL_连接);
返回0;
}
:
SSL_get_error()返回结果代码(适用于C“开关”
语句)对于前面对SSL_connect()、SSL_accept()的调用,
SSL上的SSL_do_handshake()、SSL_read()、SSL_peek()或SSL_write()。这个
TLS/SSL I/O函数返回的值必须传递给
参数ret中的SSL\u get\u error()
:
ERR_get_error()从线程的
错误队列并删除该条目。可以调用此函数
重复,直到不再返回错误代码
因此,后者用于更广泛的用途,不应同时使用,因为:
在尝试TLS/SSL I/O操作之前,当前线程的错误队列必须为空,否则SSL\u get\u error()将无法可靠工作
因此,您必须使用ERR_get_error读取所有错误并处理它们(或者像在代码示例中使用ERR_clear_error
那样通过删除来忽略它们),然后执行IO操作。你的方法似乎是正确的,尽管我目前无法自己检查所有方面
有关更多信息,请参阅和
编辑:根据教程,BIO_uu例程可能会生成错误并影响错误队列:
第三个字段是生成错误的包的名称,
例如“BIO例程”或“bignum例程”
SSL_get_error和ERR_get_error之间有什么区别
OpenSSL有两个逻辑部分。首先是SSL库,libssl.a
(和libssl.so
),它包括与通信相关的内容。第二个是密码库,libcrypto.a
(和libcrypto.so
),它包括大数字、配置、输入/输出等
libssl.a
取决于libcrypto.a
,以及link命令被排序为-lssl-lcrypto
的原因
您可以使用SSL\u get\u error
从SSL部分库检索大多数错误,也可以使用ERR\u get\u error
检索库的SSL部分以外的错误
这是在OpenSSL中进行错误处理的正确方法吗 您显示的代码更接近“如何关闭SSL套接字”。最终,旋转控制了两种情况。第一种是半开放连接,当客户端关闭而不发送closenotify消息时。第二个是程序在发送关闭通知消息时的行为
很难回答“正确吗”,因为我们不知道你想要的行为。如果您不关心是否发送了关闭通知,那么我相信您只需要调用
SSL\u shutdown
一次,而不管客户端做什么。我的预期行为是等待关闭通知。我对SSL\u get\u error和ERR\u get\u error的使用是否正确?我没有遇到与ERR_error_string等效的SSL_*,因此我假设SSL_state_string将产生相同的功能,但我不确定。它看起来像@Red。我编辑了我的答案。有关更多信息,请参阅。