首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenSSL错误处理

OpenSSL错误处理
EN

Stack Overflow用户
提问于 2016-06-23 09:25:17
回答 2查看 18.6K关注 0票数 11

这是在OpenSSL中进行错误处理的正确方法吗?SSL_get_errorERR_get_error之间的区别是什么?在这方面,文档相当含糊。

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-23 09:37:53

SSL_get_error

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

ERR_get_error()从线程的错误队列中返回最早的错误代码,并删除该项。可以重复调用此函数,直到不再返回错误代码为止。

因此,后者用于更一般的用途,它们不应该一起使用,因为:

在尝试TLS/SSL I/O操作之前,当前线程的错误队列必须为空,否则SSL_get_error()将无法可靠地工作。

因此,您必须使用ERR_get_error读取所有错误并处理它们(或者像在使用ERR_clear_error的代码示例中那样通过删除来忽略它们),然后执行IO操作。你的方法似乎是正确的,尽管我现在不能自己检查它的所有方面。

有关更多信息,请参阅this answerthis post

编辑:根据this教程,BIO_例程可能会生成错误并影响错误队列:

第三个字段是生成错误的包的名称,例如"BIO routines"或"bignum routines“。

票数 7
EN

Stack Overflow用户

发布于 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一次,无论客户端做什么。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37980798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档