c++ - TLS 握手成功后,服务器关闭并出现错误 SSL 例程 :SSL3_GET_RECORD:wrong version number

标签 c++ ssl openssl tls1.2

我们使用 openssl 1.0.2k 来实现 TLS 相关功能。 在我们的一个部署中,客户端能够使用 TLSv1.2 完成 TLS 握手,并能够向服务器发送应用程序数据。在一些请求之后,TLS 连接从服务器端关闭并出现以下错误 “错误:1408F10B:SSL 例程:SSL3_GET_RECORD:错误的版本号”

TLS 握手步骤:

1. Client hello
2. Server Hello
3. Certificate,Certificate Request, Server hello done
4. Certificate,Client Key Exchange,Change Cipher spec,Encrypted handshake message
5. Change Cipher spec,Encrypted handshake message
6. Application data exchanges between client and server
7. Encrypted Alert(server to client)
8. Encrypted Alert( client to server

来自服务器端的错误日志显示“错误:1408F10B:SSL 例程:SSL3_GET_RECORD:版本号错误”

您能否告诉我们导致此问题的原因。如果 ssl 版本不匹配,那么握手阶段应该不会成功,对吗? 但在我们的例子中,握手是成功的,并且在一些应用程序数据传输之后,我们的服务器失败并出现此错误。

最佳答案

If the ssl version is mismatching then the handshake phase should not succeed right?

没有。任何 TLS 数据包都有 header , header 中有 TLS 版本:

(
    byte - record_type
    byte[2] - version
    byte[2] - length
) header
byte[length] - encrypted or raw data

header 始终是原始的,从不加密。即使在握手期间客户端在所有 TLS 数据包中发送了 TLS 1.2 版本,他也可以在握手完成后发送另一个版本。或者中间的某个人可以修改网络流量。在这种情况下,OpenSSL 会抛出描述的错误。

关于c++ - TLS 握手成功后,服务器关闭并出现错误 SSL 例程 :SSL3_GET_RECORD:wrong version number,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51473920/

相关文章:

node.js - 错误状态 Unable to require(node_modules/prisma/libquery_engine-debian-openssl-1.1.x.so.node) while npx performing prisma generate

openssl - 在自定义cert_verify_callback中获取服务器发送的openssl x509证书链

c# - 将图像效果(灰度)应用到屏幕(PC监视器)

c++ - 10 的幂的表查找

ssl - 我怎样才能让 Heroku 的 SSL 功能,证书 :auto, 为我的非 www 域工作?

tomcat - Tomcat 8.5 上的多个 SSL 配置

java - 使用启用了 TLS 的 kafka-topics cli 命令时出现问题

apache - 将 '-servername' 参数与 openssl s_client 一起使用

Android、OpenGL ES 2.0、ndk - glCheckFramebufferStatus 返回 GL_FRAMEBUFFER_UNSUPPORTED

c++ - Qt 模型测试,removeRows