gpt4 book ai didi

c - 如何检查连接是否为 SSL?

转载 作者:行者123 更新时间:2023-12-03 11:51:49 25 4
gpt4 key购买 nike

我有一个使用 OpenSSL 的 C 服务器应用程序,我在同一个端口上接收所有流量。有没有一种安全的方法来检查传入的数据是 SSL 连接还是其他什么?

最佳答案

TLS 连接上发生的第一件事是客户端发送 ClientHello。 ClientHello 以字节值 22 开头( '\x16' ) 将其识别为握手消息。

如果您的应用程序协议(protocol)是基于文本的,那么它将不包含任何 22字节(它不是可打印的字符),因此第一个字节足以区分 your-protocol-over-TCP 和 your-protocol-over-TLS-over-TCP。

如果您的应用程序协议(protocol)不是基于文本的,并且非 TLS 连接可能从客户端发送 22 开始。字节,你必须更深入地挖掘。接下来的 2 个字节是 TLS 主要和次要版本号;目前您可以预期主版本字节为 3并且次要版本字节位于 1 范围内的某个位置至3 .如果您的客户端使用过时的、被破坏的 SSL 版本,则可以使用较低的数字,而 future 对 TLS 的更新将可以使用更高的数字,因此您必须灵活。

希望你能排除22作为协议(protocol)的非 TLS 版本的第一个字节。

您可以使用 recvMSG_PEEK检查第一个字节而不消耗它,所以在你做出决定之后,它仍然会在那里供 TLS 库或你的应用程序协议(protocol)读取。

另一个可能的复杂情况:如果您的应用程序协议(protocol)要求服务器在客户端之前发言,那么您就有问题了。客户端连接后,它可能正在等待您的非 TLS 问候,或者它可能正在发送 ClientHello。这个问题只能通过超时来解决——如果客户端在某个时间范围内没有发送任何东西,假设它不会发送 ClientHello 并继续使用非 TLS 版本的协议(protocol)。这会通过延迟连接启动来惩罚非 TLS 客户端,但没有办法避免这种情况。

关于c - 如何检查连接是否为 SSL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36865867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com