如何处理SSL_accept上的SSL_ERROR_SSL

问题描述 投票:0回答:1

我使用 openssl(开发库,

<openssl/ssl.h>
)用 C 语言编写一个小型、简单的服务器。由于我只在本地测试它,所以我使用自签名证书。第一次连接时,由于我的浏览器不信任证书,因此
SSL_accept()
返回
SSL_ERROR_SSL
,这很好,这就是应该发生的情况。 我想知道我应该如何处理错误
SSL_ERROR_SSL
,因为
SSL_get_error()
上的文档说:

SSL_ERROR_SSL SSL 库中发生不可恢复的致命错误,通常是协议错误。 OpenSSL 错误队列包含有关错误的更多信息。如果发生此错误,则不应在连接上执行进一步的 I/O 操作,并且不得调用 SSL_shutdown() 。 如果我不能

SSL_shutdown()
,我该如何处理 ssl 连接?如何重用
SSL*
对象?为什么我不能打电话给
SSL_shutdown()

我尝试查看错误队列,这给了我预期的不受信任证书错误。 Openssl.org 没有任何答案,似乎大多数程序都试图避免处理这个问题而不是处理它。

c ssl openssl libssl
1个回答
0
投票

当 SSL_accept() 在证书不受信任的情况下返回 SSL_ERROR_SSL 时,表示 SSL 库中存在不可恢复的致命错误,通常是协议错误。

在这种情况下,您不应在连接上执行任何进一步的 I/O 操作,并且不得调用 SSL_shutdown()。

要处理此错误并继续使用 SSL* 对象,您可以按照以下步骤操作:

清理 SSL 对象:您应该通过调用 SSL_free(ssl) 释放与 SSL 对象关联的已分配资源。这将释放 SSL 会话和关联的数据结构。

关闭底层socket:关闭与SSL连接关联的socket描述符,以释放系统资源。您可以使用 close() 或 shutdown() 函数来实现此目的。

妥善处理错误:您可以通知客户端或用户由于证书不受信任而导致 SSL 握手失败。提供处理这种情况的说明或选项,例如将客户端配置为信任自签名证书或生成受信任的证书。

如果需要,创建新的 SSL 上下文和 SSL 对象:如果要继续使用 SSL 进行后续连接,可以创建新的 SSL 上下文,加载适当的证书和私钥,然后使用新上下文创建新的 SSL 对象。这允许您使用不同的证书或更新的信任设置再次尝试 SSL 握手。

需要注意的是,处理 SSL 错误可能很复杂,适当的方法可能取决于应用程序的具体要求。建议查阅 OpenSSL 文档,寻求 OpenSSL 社区的指导,或考虑使用为 SSL/TLS 处理提供抽象的更高级别的库或框架,这可以简化错误处理和证书管理。

© www.soinside.com 2019 - 2024. All rights reserved.