C 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

这是在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_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。我编辑了我的答案。有关更多信息,请参阅。