Python 3.6.8编译安装报错SSL模块缺失怎么解决
在 CentOS、Ubuntu 等 Linux 系统上用源码编译 Python 3.6.8 时,如果系统缺少 OpenSSL 开发库,或者 OpenSSL 版本与 Python 源码不兼容,编译完成后执行 import ssl 或使用 pip 都会报错提示 SSL 模块不可用。解决的关键是:先让系统具备正确版本的 OpenSSL 开发文件,再让 Python 的编译过程能找到它们。本文从错误表现讲起,按顺序给出排查和修复方法。
错误的典型表现
编译安装 Python 3.6.8 后,常见的报错有以下几种形式:
在 make 结束时的编译摘要里出现:
Python build finished successfully!
The necessary bits to build these optional modules were not found:
_ssl
安装完成后在 Python 交互环境执行 import ssl 时报错:
>>> import ssl
ModuleNotFoundError: No module named '_ssl'
用 pip install 安装任何包时提示:
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
这三种表现的根本原因是同一个:Python 编译时没有成功构建 _ssl 扩展模块。这个模块是 CPython 对 OpenSSL 的 C 语言绑定,编译它需要系统中存在 OpenSSL 的头文件(.h)和共享库(.so)。
图1:SSL 模块缺失的排查与修复流程
第一步:安装 OpenSSL 开发库
绝大多数情况下,报错的直接原因是系统没有安装 OpenSSL 的开发包。不同发行版的包名不同:
CentOS / RHEL 7:
yum install openssl-devel
Ubuntu / Debian:
apt-get install libssl-dev
安装后可以确认头文件是否就位:
ls /usr/include/openssl/ssl.h
如果能看到这个文件,说明开发库已到位。接下来需要回到 Python 源码目录重新编译。注意:仅安装开发库还不够,必须让 Python 的 configure 重新检测到 OpenSSL,然后重新 make。
第二步:重新编译 Python 3.6.8
回到源码解压目录,依次执行:
cd /usr/local/src/Python-3.6.8
./configure --prefix=/usr/local/python3 --with-ssl
make
make install
编译完成后查看 make 输出的最后几行。如果不再出现 _ssl 在"not found"列表里,就说明 SSL 模块已成功编译。
验证方法:
/usr/local/python3/bin/python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
正常输出类似:
OpenSSL 1.0.2k-fips 26 Jan 2017
系统自带 OpenSSL 版本过低的情况
在 CentOS 6 或某些较旧的系统上,系统自带的 OpenSSL 版本是 1.0.1 甚至更低。虽然 Python 3.6.8 本身对 OpenSSL 的最低要求是 1.0.2,但如果你同时需要 TLS 1.2 以上的安全连接,更建议手动编译一个较新的 OpenSSL 版本(例如 1.1.1 系列),然后让 Python 链接到它。
手动编译 OpenSSL 的步骤:
# 下载并解压 OpenSSL 1.1.1w(或你需要的版本)
cd /usr/local/src
tar xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
make
make install
编译完成后,需要让系统能找到新装的共享库:
echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/openssl.conf
ldconfig
然后回到 Python 源码目录,在 configure 时指定自定义 OpenSSL 的位置:
cd /usr/local/src/Python-3.6.8
./configure --prefix=/usr/local/python3 \
--with-openssl=/usr/local/openssl
make
make install
--with-openssl 参数后 make 仍然提示 _ssl 缺失,检查 /usr/local/openssl/lib 下是否存在 libssl.so 和 libcrypto.so。如果只有 .a 静态文件而没有 .so,说明 OpenSSL 编译时没有加 shared 参数,需要重新编译 OpenSSL。
图2:系统包管理器安装与手动编译安装 OpenSSL 的关键差异
修改 Modules/Setup 文件(备选方案)
在少数情况下,即使 OpenSSL 开发库已经安装,Python 的 configure 仍然没有正确检测到它。这时可以手动编辑 Python 源码目录下的 Modules/Setup 文件(或 Modules/Setup.dist,取决于版本),找到以下被注释的行:
# SSL=/usr/local/ssl
# _ssl _ssl.c \
# -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
# -L$(SSL)/lib -lssl -lcrypto
去掉注释并修改 SSL 路径为实际安装位置。如果使用系统默认的 OpenSSL,路径通常是 /usr:
SSL=/usr
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib64 -lssl -lcrypto
注意 CentOS 7 上 64 位系统的库文件在 /usr/lib64 而非 /usr/lib,路径写错会导致链接失败。修改后重新执行 make 和 make install。
编译完成后 pip 仍然报 SSL 错误
有些情况下 import ssl 已经不报错,但 pip 仍然无法正常下载包。这通常是因为编译 Python 时链接的 OpenSSL 运行时找不到证书文件。可以通过以下方式确认:
python3 -c "import ssl; print(ssl.get_default_verify_paths())"
输出示例:
DefaultVerifyPaths(cafile='/etc/pki/tls/cert.pem', capath='/etc/pki/tls/certs', ...)
如果输出中的 cafile 路径不存在,需要安装 CA 证书包:
# CentOS / RHEL
yum install ca-certificates
# Ubuntu / Debian
apt-get install ca-certificates
如果使用的是手动编译的 OpenSSL,其默认证书目录可能是 /usr/local/openssl/certs,这个目录默认为空。可以创建符号链接指向系统证书:
ln -s /etc/pki/tls/cert.pem /usr/local/openssl/cert.pem
图3:从安装依赖到验证成功的完整操作步骤
容易混淆的几个细节
--with-ssl 与 --with-openssl 的区别。 Python 3.6 的 configure 同时支持这两个参数。--with-ssl 是旧写法,只是标记"需要 SSL 支持",Python 会在默认路径下搜索 OpenSSL。--with-openssl=/path 是更明确的写法,直接告诉编译系统 OpenSSL 的安装前缀在哪里。如果 OpenSSL 装在非默认位置,必须用 --with-openssl。
编译了但没有 make install。 有时用户在第一次 make install 后修复了 OpenSSL 依赖,再次运行 make 后忘了执行 make install,导致安装目录下的 Python 仍然是旧的。修复后务必完整执行 make && make install。
make clean 的必要性。 如果修改了 configure 参数或 Modules/Setup 文件后直接 make,残留的旧对象文件可能导致新配置没有生效。建议在重新 configure 前执行一次 make clean。
完整操作汇总
以 CentOS 7 使用系统 OpenSSL 为例,从头到尾的命令序列:
# 1. 安装编译所需的全部依赖
yum groupinstall "Development Tools"
yum install openssl-devel bzip2-devel libffi-devel zlib-devel readline-devel sqlite-devel
# 2. 下载并解压 Python 3.6.8 源码
cd /usr/local/src
tar xzf Python-3.6.8.tgz
cd Python-3.6.8
# 3. 配置、编译、安装
./configure --prefix=/usr/local/python3 --with-ssl --enable-optimizations
make
make install
# 4. 验证
/usr/local/python3/bin/python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
/usr/local/python3/bin/pip3 install --upgrade pip
如果第 4 步 import ssl 没有报错且输出了 OpenSSL 版本号,pip 也能正常下载,说明问题已经解决。
图4:Python 应用层、_ssl 扩展模块与 OpenSSL 库之间的依赖关系总结
SSL 模块缺失是 Python 源码编译中最常见的问题之一,核心原因就是编译时找不到 OpenSSL 的开发文件。绝大多数情况下,安装系统对应的 openssl-devel 或 libssl-dev 包然后重新编译即可解决。只有在系统 OpenSSL 版本过低或安装在非标准位置时,才需要手动编译 OpenSSL 并用 --with-openssl 指定路径。修复后记得验证 import ssl 和 pip 均正常工作,确认问题彻底消除。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









