这是在OpenSSL中进行错误处理的正确方法吗?SSL_get_error和ERR_get_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;
}发布于 2016-06-23 09:37:53
ssl SSL_get_error()返回前面对SSL_connect()、SSL_accept()、SSL_do_handshake()、SSL_read()、SSL_peek()或SSL_write()的调用的结果代码(适用于C "switch“语句)。必须在参数ret中将TLS/SSL I/O函数返回的值传递给SSL_get_error()。
ERR_get_error()从线程的错误队列中返回最早的错误代码,并删除该项。可以重复调用此函数,直到不再返回错误代码为止。
因此,后者用于更一般的用途,它们不应该一起使用,因为:
在尝试TLS/SSL I/O操作之前,当前线程的错误队列必须为空,否则SSL_get_error()将无法可靠地工作。
因此,您必须使用ERR_get_error读取所有错误并处理它们(或者像在使用ERR_clear_error的代码示例中那样通过删除来忽略它们),然后执行IO操作。你的方法似乎是正确的,尽管我现在不能自己检查它的所有方面。
有关更多信息,请参阅this answer和this post。
编辑:根据this教程,BIO_例程可能会生成错误并影响错误队列:
第三个字段是生成错误的包的名称,例如"BIO routines"或"bignum routines“。
发布于 2016-06-23 14:46:31
和SSL_get_error和ERR_get_error的区别是什么?
OpenSSL有两个逻辑部分。首先是SSL库,libssl.a (和libssl.so),它包含了与通信相关的东西。第二个是密码库libcrypto.a (和libcrypto.so),它包括大数、配置、输入/输出等。
libssl.a依赖于libcrypto.a,这就是为什么link命令被定为-lssl -lcrypto的原因。
您可以使用SSL_get_error从SSL部分库中检索大多数错误,并使用ERR_get_error来检索库的SSL部分之外的错误。
这是在OpenSSL中进行错误处理的正确方法吗?
您展示的代码更接近于“如何关闭SSL套接字”。最终,旋转控制了两种情况。首先是半开连接,当客户端关闭而没有发送关闭通知消息时。第二个是您的程序在发送关闭通知消息时的行为。
很难回答“它是否正确”,因为我们不知道您想要的行为。如果您不关心是否发送关闭通知,那么我相信您只需要调用SSL_shutdown一次,无论客户端做什么。
https://stackoverflow.com/questions/37980798
复制相似问题