CentOS升级OpenSSL到1.1.1t(兼容nginx):零报错编译+平滑重启全记录

CentOS升级OpenSSL到1.1.1t(兼容nginx)

线上跑了两年的老机器,昨晚被扫描器打出“SSL版本过低”警告,老板一句“天亮前修好”把我按在键盘前。CentOS自带OpenSSL还是老掉牙的1.0.2,nginx握手直接拒掉TLS1.3,浏览器地址栏红得发紫。踩坑五小时,把最顺的一套流程压成下面这份笔记,照着敲,保准一次过。
先别急着动手:三件事查完再开刀
1. 确认当前版本
openssl version -a 看一眼,如果返回1.0.2k或更低,就别幻想打补丁,直接上源码。
2. 确认nginx是否动态链接
nginx -V 2>&1 | grep -o 'openssl.*' 如果路径指向系统库,升级后必须重编nginx;如果是静态编译的自带库,可以省一步,但建议统一用系统新库,方便后续维护。

3. 确认开发工具齐全
yum groupinstall "Development Tools" -y 把gcc、make、perl一股脑装齐,缺一个都编译不过。
下载与校验:别让压缩包带毒
去官网拉1.1.1t.tar.gz,wget断点续传最稳。下完顺手校验:
sha256sum openssl-1.1.1t.tar.gz 对照官网给的哈希,哪怕差一位都重下,别省这几秒。
编译安装:三条参数决定生死
解压后进去,别急着./config,先打补丁路径:
./config --prefix=/usr/local/openssl111 --openssldir=/usr/local/openssl111 shared zlib-dynamic -fPIC
重点解释:
shared 生成动态库,nginx才能链上;
zlib-dynamic 让压缩交给系统zlib,减少冗余;
-fPIC 让库文件位置无关,64位系统必加,不加nginx编译时报“relocation against symbol”直接爆炸。
make -j$(nproc) 十来秒完事;make install 把文件放进干净目录,不动老系统库,回滚秒删。
软链与库路径:别让系统找不到新娃
echo "/usr/local/openssl111/lib" > /etc/ld.so.conf.d/openssl111.conf
ldconfig -v 刷新缓存,再跑 ldconfig -p | grep openssl 看到1.1.1t排在最前才算成功。
备份旧命令:mv /usr/bin/openssl /usr/bin/openssl.old
ln -s /usr/local/openssl111/bin/openssl /usr/bin/openssl
openssl version 返回1.1.1t,命令行层面升级完成。
重编nginx:一条configure别写错
进nginx源码目录,原来怎么装这次还怎么装,只改一条:
./configure --with-openssl=/usr/local/openssl111 --with-openssl-opt="shared zlib-dynamic" 原来那一长串模块别丢,复制粘贴最稳。
make 完别急着 make install,先 objs/nginx -t 测试配置,确认没报错再覆盖:
cp objs/nginx /usr/sbin/nginx.new && mv /usr/sbin/nginx /usr/sbin/nginx.bak && mv /usr/sbin/nginx.new /usr/sbin/nginx
nginx -t && kill -USR2 cat /var/run/nginx.pid 平滑切到新进程,老连接不断,新连接直接上TLS1.3,浏览器灰锁秒变绿。
验证:三行命令让老板闭嘴
openssl sclient -connect 域名:443 -tls13 2>/dev/null | grep "TLSv1.3"
curl -I --tlsv1.3 https://域名 看返回200
SSL Labs在线检测直接拉A+,三项全绿截图甩群里,工单瞬间清零。
回滚预案:30秒回到旧版本
真出幺蛾子,一条命令秒回:
mv /usr/sbin/nginx.bak /usr/sbin/nginx && kill -HUP cat /var/run/nginx.pid
rm /usr/bin/openssl && mv /usr/bin/openssl.old /usr/bin/openssl
rm /etc/ld.so.conf.d/openssl111.conf && ldconfig
服务原样跑,老板都看不出你折腾过。
常见坑Top3:提前避雷
1. 缺perl模块
编译时报“perl module File::Copy missing”,yum install perl-core -y 立刻解决。
2. 路径写死
configure时--with-openssl写成了源码路径,结果nginx每次启动都去编译一次,机器直接卡死。正确做法是装好的/usr/local/openssl111。
3. 缓存没清
升级完浏览器还是报旧版本,其实是CDN缓存,curl直接测源站,别被表象忽悠。
后续维护:两条小习惯省大事
每月首日跑 yum update 前,先备份 /usr/local/openssl111 目录,打包丢到内网仓库;
nginx升级前先 staging 环境 objs/nginx -t 跑一遍,生产再动,血与泪的教训。
整套流程跑下来,CentOS升级OpenSSL到1.1.1t(兼容nginx)不再神秘,键盘敲完天还没亮,老板继续睡觉,我继续摸鱼。
