OpenSSL (client side)OpenSSL CLI
错误信息
SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
也可能输出为
- error:0A00042E:SSL routines::tlsv1 alert protocol version
- SSL alert number 70
OpenSSL 3.0 和 3.5 都输出“error:0A00042E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:<source>:SSL alert number 70”;OpenSSL 1.1.1 使用的代码是 1409442E。基于 OpenSSL 构建的客户端(curl、Python、Ruby、PHP)显示同样的原因文本。
OpenSSL (client side) — TLS alert 70 (protocol_version) received from the server
含义
客户端从服务器收到了 TLS 告警 70(protocol_version):客户端提供的协议版本,服务器一个都不接受。“tlsv1”只是 OpenSSL 对 TLS 1.0 起定义的告警使用的系列名称。实际情况通常是服务器只支持 TLS 1.0/1.1,而客户端提供的是 1.2 和 1.3;或者客户端被限制在服务器已禁用的版本上。
原因
服务器只支持 TLS 1.0 或 1.1
常见老旧的专用设备、旧版 Windows/IIS 或 Java 服务器,以及从未更新过的设备。
客户端被指定使用旧版本
偶见-tls1 之类的参数,或者遗留在配置中的 MaxProtocol 设置,会让客户端提供当前服务器拒绝的版本。
仅支持 TLS 1.3 的服务器遇上限于 1.2 的客户端
偶见一些经过加固的端点只接受 TLS 1.3;旧客户端无法连接。
修复方法
- 1.
找出服务器接受的版本
显式地逐一尝试每个版本(安全级别 0 允许 TLS 1.0/1.1 基于 SHA-1 的握手,只在这次测试中使用)。
bash for v in tls1 tls1_1 tls1_2 tls1_3; do printf '%-7s ' "$v" echo | openssl s_client -connect legacy.example.com:443 -servername legacy.example.com -"$v" \ -cipher 'DEFAULT:@SECLEVEL=0' >/dev/null 2>&1 && echo accepted || echo refused done - 2.
在服务器上启用 TLS 1.2 和 1.3
更新服务器的协议设置(如果它的 TLS 库早于 TLS 1.2,也要一并更新)。
text # nginx ssl_protocols TLSv1.2 TLSv1.3; # Apache httpd SSLProtocol -all +TLSv1.2 +TLSv1.3