更新最新OpenSSL后仍无法通过TLS连接packagist.jp求助
解决curl访问packagist.jp时的SSL握手失败问题
嘿,这个SSL握手故障我太熟了——之前帮朋友排查过几乎一模一样的情况,咱们一步步来拆解你的问题:
先理清楚你的现状
你已经把OpenSSL更新到了1.0.2l(这个版本本身是支持TLS1.2的),但不管是默认请求还是指定TLS版本,都碰到了握手失败或者“不支持的SSL版本”错误:
- 默认请求报错:
$ curl https://packagist.jp/packages.json curl: (35) error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure - 指定TLS版本的报错:
$ curl https://packagist.jp/packages.json --tlsv1.0 curl: (35) error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure $ curl https://packagist.jp/packages.json --tlsv1.1 curl: (35) Unsupported SSL protocol version $ curl https://packagist.jp/packages.json --tlsv1.2 curl: (35) Unsupported SSL protocol version
核心原因:curl和OpenSSL版本不匹配
虽然你系统的OpenSSL已经更到1.0.2l,但curl可能并没有使用这个更新后的库——很多系统里的curl是预装的,默认链接的是系统自带的旧版OpenSSL,甚至编译时没启用TLS1.2支持。这就导致你指定TLS1.2时,curl根本没法识别这个选项。
解决方案步骤
1. 先确认curl实际使用的OpenSSL版本
先跑这个命令看curl的依赖:
curl --version
看输出里的OpenSSL/xxx部分,比如如果显示的是OpenSSL/1.0.1e,那说明curl确实用的是旧库,和你系统的OpenSSL版本不一致。
2. 更新curl到支持TLS1.2的版本
方案A:用包管理器更新(推荐,如果你用的是主流发行版)
- Ubuntu/Debian:
sudo apt update && sudo apt install --only-upgrade curl - CentOS/RHEL:
sudo yum update curl
更新完再用curl --version确认OpenSSL版本已经和系统一致。
方案B:手动编译curl(如果包管理器没有最新版)
如果你的系统包管理器里的curl版本太旧,就需要手动编译,指定链接你更新后的OpenSSL:
- 下载curl稳定版源码
- 编译时指定OpenSSL路径:
./configure --with-openssl=/usr/local/ssl # 替换成你OpenSSL的实际安装路径 make && sudo make install - 重启终端后,再用
curl --version确认版本匹配。
3. 尝试指定兼容的加密套件
有些服务器会限制只接受特定的加密套件,即使TLS版本对了也会握手失败。可以试试用--ciphers参数指定常用的兼容套件:
curl https://packagist.jp/packages.json --tlsv1.2 --ciphers ECDHE-RSA-AES128-GCM-SHA256
4. 排查CA证书问题(备选)
如果上面的方法都不行,可能是系统CA证书过期导致无法验证服务器证书。可以先临时跳过验证测试:
curl https://packagist.jp/packages.json --tlsv1.2 --insecure
如果这时候能成功,就需要更新系统的CA证书包:
- Ubuntu/Debian:
sudo apt install --only-upgrade ca-certificates - CentOS/RHEL:
sudo yum update ca-certificates
总结
90%的概率是curl和OpenSSL版本不匹配导致的,先确认curl的OpenSSL版本,再针对性更新curl就能解决问题。
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

