CentOS 7下Python3.6用pip安装库时出现SSL UNKNOWN_PROTOCOL错误
报错核心原因
这个报错和证书验证没有任何关系,所以你之前添加的一堆trusted-host参数从一开始就不对症。问题本质是CentOS 7自带的OpenSSL 1.0.2k的TLS协商逻辑,和你当前安装的pip 21.0.1版本的网络栈不兼容:pypi官方早已完全关闭TLS 1.0/1.1的连接通道,两者发起连接时无法就可用的TLS加密版本完成握手,最终直接抛出[SSL: UNKNOWN_PROTOCOL] unknown protocol错误。你提到旧版本pip可以正常下载资源,就是因为旧版pip的TLS协商兼容逻辑,还能适配老OpenSSL和新的pypi服务端完成握手。
解决步骤
- 先卸载用户目录下不兼容的高版本pip
你当前调用的pip 21.0.1是安装在用户个人目录下的,优先级比系统自带的pip高,是直接导致报错的源头。执行命令卸载:python3.6 -m pip uninstall pip -y - 安装系统适配的兼容版pip
用yum安装和当前系统OpenSSL版本完全匹配的官方打包版pip,执行:yum install python36-pip
这个版本的pip是CentOS官方针对系统环境验证过的,不存在老OpenSSL兼容问题。 - 强制指定TLS版本,从根源规避握手失败
CentOS 7的OpenSSL 1.0.2k本身是支持TLS 1.2协议的,只是默认协商时可能优先尝试已被服务端禁用的旧协议,才会触发报错。创建pip全局配置文件~/.pip/pip.conf,写入如下内容:[global] tls-version = tlsv1.2 index-url = 你日常使用的稳定镜像源地址 trusted-host = 对应镜像源的域名 - 验证修复效果
重启终端让环境变量生效后,执行安装命令测试:python3.6 -m pip install flask
此时不会再出现SSL握手相关报错,可以正常完成包安装。
常见排障误区
- 不需要反复升级openssl-devel:CentOS 7官方源提供的最高版本openssl-devel就是1.0.2k,没有更高的兼容版本,反复重装没有实际作用。
- 不要依赖
trusted-host解决这类报错:这个参数仅用于跳过证书合法性校验,无法解决TLS协议协商不匹配的核心问题,添加再多该参数也对当前报错无效。
内容的提问来源于stack exchange,提问作者mr odus
相关产品推荐
相关产品推荐

