升级 openssl 及 Python 禁用不安全的SSL协议版本
一、 环境介绍
系统:Redhat 5.4
Python:系统原始为Python2.4,升级到Python-2.7.13
GCC:4.1.2 编译openssl需要4.2以上,因此升级gcc至5.4
openssl: 0.9.8,升级到1.0.2
二、编译gcc 5.4.0
系统自带的gcc为4.1.2版本,编译openssl时会报编译器错误,从这个帖子中得知4.2是支持的最低的版本,因此,需要升级gcc到4.2版本以上。这里我们将编译5.4.0版本的gcc。
1. 将gcc-5.4.0的源码包解压,准备进行编译安装。
tar zxvf gcc-5.4.0.tar.gz
cd gcc-5.4.0
2. 下载依赖包
./contrib/download_prerequisites
3. 配置编译参数
cd ..
mkdir gcc-build-5.4.0
cd gcc-build-5.4.0
../gcc-5.4.0/configure \
--enable-checking=release \
--enable-languages=c,c++ \
--disable-multilib
4. 编译并安装
make -j4 #允许4个编译命令同时执行,加速编译过程
make install
5. 检查编译是否成功
gcc编译完成后默认会安装至/usr/local/bin
$ /usr/local/bin/gcc -v
...
gcc version 5.4.0 (GCC)
...
6. 配置PATH指向新的gcc
在命令行中临时将PATH修改为优先从/usr/local/bin中查找命令
export PATH=/usr/local/bin/:$PATH
三、编译安装openssl
升级完gcc,就可以编译openssl了
1. 下载源码
编译环境为Redhat5.4,openssl版本比较低,是0.9.8e-fips-rhel5
,因此,需要将openssl升级到1.0.2
以上。
首先,从openssl官方网站下载1.0.2
版本的openssl源码。
wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2u.tar.gz
2. 配置编译参数
因为openssl与系统中很多程序息息相关,为了避免升级openssl给系统带来的未知影响,我们不能用新的openssl覆盖系统中原始的openssl,因此,在编译之前,进行一些编译参数的配置,并将openssl安装在/opt/openssl-1.0.2
目录下。
./config \
--prefix=/opt/openssl-1.0.2 \
--openssldir=/opt/openssl-1.0.2 \
enable-ec_nistp_64_gcc_128 \
-fPIC
3. 编译与安装开始编译
执行以下命令:
$ make depend
$ make
$ make install
编译完成,看下openssl版本
$ /opt/openssl-1.0.2/bin/openssl version
OpenSSL 1.0.2u 20 Dec 2019
四、重新编译python并使用新的openssl
1. 准备源码
wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz
tar zxvf Python-2.7.13.tgz
cd Python-2.7.13
2. 修改编译脚本,指向新的openssl路径
修改setup.py
,增加我们自定义的openssl路径/opt/openssl-1.0.2/include
和/opt/openssl-1.0.2/lib
# Detect SSL support for the socket module (via _ssl)
search_for_ssl_incs_in = [
'/usr/local/ssl/include',
'/opt/openssl-1.0.2/include',
'/usr/contrib/ssl/include/'
]
ssl_incs = find_file('openssl/ssl.h', inc_dirs,
search_for_ssl_incs_in
)
if ssl_incs is not None:
krb5_h = find_file('krb5.h', inc_dirs,
['/usr/kerberos/include'])
if krb5_h:
ssl_incs += krb5_h
ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
['/usr/local/ssl/lib',
'/opt/openssl-1.0.2/lib',
'/usr/contrib/ssl/lib/'
] )
继续修改Modules/Setup.dist
配置文件
找到下列SSL所在行并按下列内容修改,其中SSL为openssl自定义安装的路径
# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/opt/openssl-1.0.2
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
3. 编译与安装
编译参数的配置:
./configure \
--prefix=/opt/python2.7.13 \
--enable-shared
编译并安装
make
make install
安装完毕,执行以下命令测试Python是否使用了新的openssl
$ python -c 'import ssl; print(ssl.OPENSSL_VERSION)'
OpenSSL 1.0.2u 20 Dec 2019
五、修改SSL连接代码,禁用不安全的SSL协议版本
1. 修改server端SSL连接代码
在server端禁用了SSLv3 SSLv2 TLS1.0 TLS1.1
这几个版本
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.options |= ssl.OP_NO_SSLv3
context.options |= ssl.OP_NO_SSLv2
context.options |= ssl.OP_NO_TLSv1
context.options |= ssl.OP_NO_TLSv1_1
2. 修改client端SSL连接代码
采用client端与server端支持的最高协议版本进行通信
在client端
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)