ssl - HelloVerifyRequest 上的 Dtls 握手中使用了错误的 SSL 版本
问题描述
我在 C 中实现 DTLS 1.2 协议。在使用 openSSL 测试客户端时,我观察到 OpenSSL 发送的帧之一没有使用正确的 Dtls 版本 (1.2) 而是旧版本 (1.0)。
C 中的客户端仅支持 DTLS1.2,因此拒绝 OpenSSL 发送的帧。
C客户端发送的HelloClient:
Frame 2461: 109 bytes on wire (872 bits), 109 bytes captured (872 bits) on interface 0
Ethernet II, Src: Infineon_00:00:01 (00:03:19:00:00:01), Dst: Tp-LinkT_dc:4e:82 (50:3e:aa:dc:4e:82)
Internet Protocol Version 4, Src: 192.168.88.73, Dst: 192.168.88.77
User Datagram Protocol, Src Port: 50003, Dst Port: 60003
Datagram Transport Layer Security
DTLSv1.0 Record Layer: Handshake Protocol: Client Hello
Content Type: Handshake (22)
Version: DTLS 1.2 (0xfefd)
Epoch: 0
Sequence Number: 0
Length: 54
Handshake Protocol: Client Hello
来自 OpenSSL 服务器的响应:
Frame 2464: 90 bytes on wire (720 bits), 90 bytes captured (720 bits) on interface 0
Ethernet II, Src: Tp-LinkT_dc:4e:82 (50:3e:aa:dc:4e:82), Dst: Infineon_00:00:01 (00:03:19:00:00:01)
Internet Protocol Version 4, Src: 192.168.88.77, Dst: 192.168.88.73
User Datagram Protocol, Src Port: 60003, Dst Port: 50003
Datagram Transport Layer Security
DTLSv1.0 Record Layer: Handshake Protocol: Hello Verify Request
Content Type: Handshake (22)
Version: DTLS 1.0 (0xfeff)
Epoch: 0
Sequence Number: 0
Length: 35
Handshake Protocol: Hello Verify Request
我强制 OpenSSL 使用 1.2 版的 DTLS 运行以下命令: openssl.exe s_server -nocert -psk 01234567 -accept 443 -cipher PSK-AES128-GCM-SHA256 -dtls1_2
我在 TLS 的 RFC 中看到(https://www.rfc-editor.org/rfc/rfc5246#appendix-E)
TLS versions 1.0, 1.1, and 1.2, and SSL 3.0 are very similar, and use
compatible ClientHello messages; thus, supporting all of them is
relatively easy. Similarly, servers can easily handle clients trying
to use future versions of TLS as long as the ClientHello format
remains compatible, and the client supports the highest protocol
version available in the server.
没有为 HelloRequestVerify 指定任何内容(rfc5246 或 rfc6347),但这是否意味着应该接受 1.0 和 1.2 之间的任何版本?
或者这是 OpenSSL 中的一个错误?
注意:如果我继续 DTLS 握手,OpenSSL 发送的每一帧都使用正确版本的 DTLS (1.2)。
解决方案
但是,为了避免在初始握手中进行版本协商的要求,DTLS 1.2 服务器实现应该使用 DTLS 1.0 版本,而不管预期要协商的 TLS 版本是什么。
(该部分包含有关该用法的更多信息。)
推荐阅读
- c# - 为什么 C# 公共静态变量不需要实例化?
- linux - 自定义 Linux 系统调用返回 -1 ENOSYS(功能未实现)
- javascript - 找到具有最大乘积的相邻元素对(错误消息)
- python - 从 Internet 将启用 xls 宏的 (xslm) 文件摄取/导入到 Python 中
- reactjs - 在 reactjs 上将数据从一页映射到另一页
- c# - 带有 FromRouteAttribute 和 FromQuery 的 RESTFul API Get 方法
- python - 有没有办法改善熊猫框架的爆炸功能?
- sql - 关于面向数据库的方法的问题
- c++ - 如何打印图形结构(使用指针向量来实现)?
- reactjs - 仅在 docker shell 中设置 create-react-app