OpenSSL (client side)OpenSSL CLI
错误信息
SSL routines:ssl_choose_client_version:unsupported protocol
也可能输出为
- error:0A000102:SSL routines::unsupported protocol
openssl CLI 输出“<thread>:error:0A000102:SSL routines:ssl_choose_client_version:unsupported protocol:<source>”;curl、Node.js 和其他应用显示“error:0A000102:SSL routines::unsupported protocol”。OpenSSL 1.1.1 使用的代码是 1425F102。
OpenSSL (client side) — SSL_R_UNSUPPORTED_PROTOCOL: the server chose a version the client does not allow
含义
客户端提供了 TLS 1.2 和 1.3,但服务器在 ServerHello 中选择了更旧的版本(通常是 TLS 1.0),而客户端的 OpenSSL 不允许使用这个版本。客户端在 ssl_choose_client_version 中中止。旧的 TLS 协议栈会忽略客户端提供的版本范围,直接用自己的版本应答;现代协议栈则会以 protocol_version 告警拒绝。
原因
服务器只支持 TLS 1.0 或 1.1
常见无人维护的服务器、老旧的专用设备和嵌入式设备。
客户端的 OpenSSL 禁止使用旧版本
常见当前的发行版把 TLS 1.2 设为最低版本(安全级别 2),因此从旧机器能正常连接的服务器,从新机器连接就会失败。
修复方法
- 1.
确认服务器使用的版本
只在这一条诊断命令中以安全级别 0 强制使用 TLS 1.0,就能看出服务器是否只支持旧版本。
bash # Allowed only for this diagnostic command: which version does the server pick? echo | openssl s_client -connect legacy.example.com:443 -servername legacy.example.com \ -tls1 -cipher 'DEFAULT:@SECLEVEL=0' -brief 2>&1 | grep -E 'Protocol version|error' - 2.
在服务器上启用 TLS 1.2 和 1.3
升级服务器(或在它前面放置现代的 TLS 终止代理)是唯一的长久之计。
text # Server side ssl_protocols TLSv1.2 TLSv1.3; # nginx SSLProtocol -all +TLSv1.2 +TLSv1.3 # Apache httpd