首页 > 系统相关 >CentOS7 源码编译安装 Python 3.8.10,开启 SSL 功能

CentOS7 源码编译安装 Python 3.8.10,开启 SSL 功能

时间:2023-06-21 17:35:05浏览次数:59  
标签:10 root openssl SSL 源码 usr local 3.8

背景

CentOS7 自带的 Python3,或者通过 yum 安装的 Python3,可能会有无法使用 ssl 的问题:

$ python3
Python 3.8.10 (default, Jun 13 2023, 14:51:15) 
[GCC 11.2.1 20220127 (Red Hat 11.2.1-9)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/python3/python3.8.10/lib/python3.8/ssl.py", line 100, in <module>
    from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION
ImportError: cannot import name 'OPENSSL_VERSION_NUMBER' from '_ssl' (unknown location)
>>> 

而使用 pip3 安装依赖项,需要用到 ssl;所以我们需要源码编译 Python3,并开启 ssl 功能。

源码编译安装 openssl

下载 openssl 源码

登录 https://www.openssl.org/source/ 下载最合适版本的 openssl。

首先尝试使用 https://www.openssl.org/source/openssl-3.1.1.tar.gz,然后源码编译 Python-3.8.10时,报出如下问题:

......
Python build finished successfully!
......

Could not build the ssl module!
Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().
LibreSSL 2.6.4 and earlier do not provide the necessary APIs, https://github.com/libressl-portable/portable/issues/381

......

如上信息提示我们,需要使用 openssl 1.0.2 或 1.1 版本。于是重新安装  https://www.openssl.org/source/openssl-1.1.1u.tar.gz :

$ cd /usr/local/src

$ wget https://www.openssl.org/source/openssl-1.1.1u.tar.gz

$ tar zxvf openssl-1.1.1u.tar.gz

$ cd openssl-1.1.1u

$ ./config --prefix=/usr/local/openssl/openssl1.1.1

$ make

$ sudo make install

至此,openssl就被安装到了 /usr/local/openssl/openssl1.1.1:

$ ll /usr/local/openssl/openssl1.1.1
total 0
drwxr-xr-x 2 root root  37 Jun 13 16:36 bin
drwxr-xr-x 3 root root  21 Jun 13 16:36 include
drwxr-xr-x 4 root root 159 Jun 13 16:36 lib
drwxr-xr-x 4 root root  28 Jun 13 16:37 share
drwxr-xr-x 5 root root 140 Jun 13 16:36 ssl

将 openssl 的 lib 添加到动态链接库

查看动态链接库文件配置

$ cat /etc/ld.so.conf
include ld.so.conf.d/*.conf

$ cd /etc/ld.so.conf.d

$ ls
bind-export-x86_64.conf                  kernel-3.10.0-1160.el7.x86_64.conf  mariadb-x86_64.conf
dyninst-x86_64.conf                      libiscsi-x86_64.conf                qt-x86_64.conf
kernel-3.10.0-1160.88.1.el7.x86_64.conf  

$ cat mariadb-x86_64.conf 
/usr/lib64/mysql

如上,可以看到,所谓添加动态链接库,就是在 /etc/ld.so.conf.d 目录中创建一个 .conf 文件,其中填写 lib.so 文件所在的目录即可。
上一步将 openssl 安装到了 /usr/local/openssl/openssl1.1.1,可以看到其中的 lib目录包含了相关的 lib*.so 文件:

$ ll /usr/local/openssl/openssl1.1.1/lib/
total 10440
drwxr-xr-x 2 root root      39 Jun 13 16:36 engines-1.1
-rw-r--r-- 1 root root 5603958 Jun 13 16:36 libcrypto.a
lrwxrwxrwx 1 root root      16 Jun 13 16:36 libcrypto.so -> libcrypto.so.1.1
-rwxr-xr-x 1 root root 3362560 Jun 13 16:36 libcrypto.so.1.1
-rw-r--r-- 1 root root 1027122 Jun 13 16:36 libssl.a
lrwxrwxrwx 1 root root      13 Jun 13 16:36 libssl.so -> libssl.so.1.1
-rwxr-xr-x 1 root root  689720 Jun 13 16:36 libssl.so.1.1
drwxr-xr-x 2 root root      61 Jun 13 16:36 pkgconfig

创建动态链接库配置

那么在 /etc/ld.so.conf.d 中创建 openssl-1.1.1.conf 文件,并填写 /usr/local/openssl/openssl1.1.1/lib 即可:

$ cat /etc/ld.so.conf.d/openssl-1.1.1.conf 
/usr/local/openssl/openssl1.1.1/lib

重新加载动态链接库

# 需要 root 权限
$ sudo ldconfig

配置 openssl 环境变量

$ sudo vim /etc/bashrc:
# 添加如下内容

OPENSSL_VERSION=1.1.1
OPENSSL_PATH=/usr/local/openssl
OPENSSL_BIN=${OPENSSL_PATH}/openssl${OPENSSL_VERSION}/bin
export PATH=${OPENSSL_BIN}:${PATH}


$ source /etc/bashrc 

查看安装结果

$ openssl version
OpenSSL 1.1.1u  30 May 2023

至此,openssl 相关环境就完全配置完毕了。

源码编译安装 python3.8.10

下载 python3.8.10 源码

$ cd /usr/local/src

$ wget https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tgz

$ tar zxvf Python-3.8.10.tgz

$ cd Python-3.8.10

编辑 Modules/Setup

编辑 /usr/local/src/Python-3.8.10/Modules/Setup

SSL=/usr/local/openssl 处的注释解除,并修改SSL为刚才安装的 openssl 路径

$ vim Modules/Setup
# 编辑后的内容如下:
SSL=/usr/local/openssl/openssl1.1.1
_ssl _ssl.c \
        -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
        -L$(SSL)/lib -lssl -lcrypto

配置 Python3.8.10

/usr/local/src/Python-3.8.10 目录下执行如下命令进行配置;

--prefix 参数用于指定后续的 make install 命令会将 Python 安装到哪个目录;

--with-openssl 参数用于指定编译出来的 Python 开启 ssl 功能,并指定 openssl 相关库文件的位置。

$ ./configure --prefix=/usr/local/python3/python3.8.10 --with-openssl=/usr/local/openssl/openssl1.1.1

......
checking for openssl/ssl.h in /usr/local/openssl/openssl1.1.1... yes
checking whether compiling and linking against OpenSSL works... yes
checking for X509_VERIFY_PARAM_set1_host in libssl... yes
checking for --with-ssl-default-suites... python
......

编译 Python3.8.10

$ make

......
The following modules found by detect_modules() in setup.py, have been
built by the Makefile instead, as configured by the Setup files:
_abc                  _ssl                  atexit
pwd                   time

running build_scripts
creating build/scripts-3.8
copying and adjusting /usr/local/src/python_src/Python-3.8.10/Tools/scripts/pydoc3 -> build/scripts-3.8
copying and adjusting /usr/local/src/python_src/Python-3.8.10/Tools/scripts/idle3 -> build/scripts-3.8
copying and adjusting /usr/local/src/python_src/Python-3.8.10/Tools/scripts/2to3 -> build/scripts-3.8
changing mode of build/scripts-3.8/pydoc3 from 664 to 775
changing mode of build/scripts-3.8/idle3 from 664 to 775
changing mode of build/scripts-3.8/2to3 from 664 to 775
renaming build/scripts-3.8/pydoc3 to build/scripts-3.8/pydoc3.8
renaming build/scripts-3.8/idle3 to build/scripts-3.8/idle3.8
renaming build/scripts-3.8/2to3 to build/scripts-3.8/2to3-3.8
/usr/bin/install -c -m 644 ./Tools/gdb/libpython.py python-gdb.py
gcc -pthread -c -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall    -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration  -I./Include/internal  -I. -I./Include    -DPy_BUILD_CORE -o Programs/_testembed.o ./Programs/_testembed.c
gcc -pthread     -Xlinker -export-dynamic -o Programs/_testembed Programs/_testembed.o libpython3.8.a -lcrypt -lpthread -ldl  -lutil -lm -L/usr/local/openssl/openssl1.1.1/lib -lssl -lcrypto   -lm
sed -e "s,@EXENAME@,/usr/local/python3/python3.8.10/bin/python3.8," < ./Misc/python-config.in >python-config.py
LC_ALL=C sed -e 's,\$(\([A-Za-z0-9_]*\)),\$\{\1\},g' < Misc/python-config.sh >python-config

安装

$ sudo make install

......
(cd /usr/local/python3/python3.8.10/bin; ln -s 2to3-3.8 2to3)
if test "x" != "x" ; then \
        rm -f /usr/local/python3/python3.8.10/bin/python3-32; \
        (cd /usr/local/python3/python3.8.10/bin; ln -s python3.8-32 python3-32) \
fi
if test "x" != "x" ; then \
        rm -f /usr/local/python3/python3.8.10/bin/python3-intel64; \
        (cd /usr/local/python3/python3.8.10/bin; ln -s python3.8-intel64 python3-intel64) \
fi
rm -f /usr/local/python3/python3.8.10/share/man/man1/python3.1
(cd /usr/local/python3/python3.8.10/share/man/man1; ln -s python3.8.1 python3.1)
if test "xupgrade" != "xno"  ; then \
        case upgrade in \
                upgrade) ensurepip="--upgrade" ;; \
                install|*) ensurepip="" ;; \
        esac; \
         ./python -E -m ensurepip \
                $ensurepip --root=/ ; \
fi
Looking in links: /tmp/tmpmsb395gk
Processing /tmp/tmpmsb395gk/setuptools-56.0.0-py3-none-any.whl
Processing /tmp/tmpmsb395gk/pip-21.1.1-py3-none-any.whl
Installing collected packages: setuptools, pip
Successfully installed pip-21.1.1 setuptools-56.0.0
WARNING: Running pip as root will break packages and permissions. You should install packages reliably by using venv: https://pip.pypa.io/warnings/venv

配置 Python 环境变量

$ sudo vim /etc/bashrc

PY_VERSION=3.8.10
PY_PATH=/usr/local/python3
PY_BIN=${PY_PATH}/python${PY_VERSION}/bin
export PATH=${PY_BIN}:${PATH}

$ source /etc/bashrc 

查看安装结果

$ python3
Python 3.8.10 (default, Jun 13 2023, 19:28:11)
[GCC 11.2.1 20220127 (Red Hat 11.2.1-9)] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import ssl
>>>

2023.06.14 Wed 14:24

标签:10,root,openssl,SSL,源码,usr,local,3.8
From: https://www.cnblogs.com/dongling/p/17496776.html

相关文章

  • Python 安装依赖包,出现 ssl.SSLCertVerificationError 的问题,解决方法
    问题描述CentOS7环境,已安装Python3.8.10。最近项目开发,需要切换solidity版本,参考开发文档,需要执行如下命令pipinstallsolc-select==0.2.0#安装指定版本solcsolc-selectinstall<solc版本号>#切换solc版本solc-selectuse<solc版本号>先使用pipinstallsolc-......
  • 解决了!新安装的win10操作系统,没有声音
    新安装的win10操作系统,没有声音1)安装Realtek高清晰音频管理器驱动,驱动名:realtekgaoqingxiyinpinguanliqi.exe,自行搜索下载2)安装完成之后,重启电脑3)打开控制面板点击任务栏搜索框或搜索图标,输入“控制面板”点击搜索结果打开控制面板。4)找到Realtek高清晰音频管理器......
  • 【资料分享】Zynq-7010/7020工业评估板规格书(双核ARM Cortex-A9 + FPGA,主频766MHz)
    1评估板简介创龙科技TLZ7x-EasyEVM是一款基于XilinxZynq-7000系列XC7Z010/XC7Z020高性能低功耗处理器设计的异构多核SoC评估板,处理器集成PS端双核ARMCortex-A9+PL端Artix-7架构28nm可编程逻辑资源,评估板由核心板和评估底板组成。核心板经过专业的PCBLayout和高低温测试验证......
  • 洛谷 P8264 [Ynoi Easy Round 2020] TEST_100
    题目Link我们不妨来考虑所有询问都是\(l=1,r=n\)的情形,这种情况下需要对每个值处理出他经过一系列变换后变成了什么数。考虑用\(\text{solve}(p,l,r)\)表示我们现在要计算\(x\in[l,r]\)的这些数在经过\(x\leftarrow|x-a_p|,x\leftarrow|x-a_{p+1}|\),一直到\(x\leftar......
  • 好的,以下是我为您拟定的自然语言处理(NLP)领域的100篇热门博客文章标题,以逻辑清晰、结
    目录1.引言2.技术原理及概念3.实现步骤与流程4.应用示例与代码实现讲解1.机器翻译2.文本分类3.情感分析5.优化与改进6.结论与展望好的,以下是我为您拟定的自然语言处理(NLP)领域的100篇热门博客文章标题,以逻辑清晰、结构紧凑、简单易懂的专业技术语言:1.《自然语言处理(NLP)......
  • 直播平台搭建源码,uni中使用轮播图
    直播平台搭建源码,uni中使用轮播图 <swiperclass="swiper"style="height:90rpx;"circularvertical="true"   :autoplay="true":interval="3000":duration="1000"><swiper-itemv-for="(item,index)in......
  • 通用密钥,无需密码,在无密码元年实现Passkeys通用密钥登录(基于Django4.2/Python3.10)
    毋庸讳言,密码是极其伟大的发明,但拜病毒和黑客所赐,一旦密码泄露,我们就得绞尽脑汁再想另外一个密码,但记忆力并不是一个靠谱的东西,一旦遗忘密码,也会造成严重的后果,2023年业界巨头Google已经率先支持了Passkeys登录方式,只须在设备上利用PIN码解锁、指纹或面部辨识等生物识别方式,即可验......
  • CF1810H Last Number
    大难题,但是非常的有意思。思路来自\(\color{black}\text{艾}\color{red}\text{利克斯·伟}\)。补充了一点小细节。题意对于一个可重集合\(S\),初始为\(\{1\dotsn\}\),执行以下操作:删除集合中的最大、最小元素\(S_{min},S_{max}\),加入\(S_{max}-S_{min}\)。最终集合只......
  • [万神网络科技]Windows12网页版开源HTML源码
    Windows12网页版开源HTML源码源码介绍Windows12网页版是一个开源项目,使用标准网络技术,例如Html、CSS和Javascript,希望让用户在网络上预先体验Windows12因为这只是概念版,所以内容可能与Windows12正式版本不一致。源码截图下载地址:vx公众号:万神的小屋......
  • FX110网:外汇交易赠金到底该不该拿?看完这篇你就懂了
    随着行业竞争越来越激烈,很多经纪商推出各种形式的赠金活动,有的赠金额度非常的高,很多做交易的朋友都喜欢找有赠金的平台。然而,在这种竞争激烈,监管缺失的情况下,原本作为普通推广手段的赠金活动,也爆发出了种种问题。所以,赠金到底该不该拿,如果想拿的话要怎么拿,成了现在很多投资者会迷茫......