2019-11-19 更新

强烈建议不要随意升级 openssl 到最新版本!!!

这段时间服务器被自己搞坏了,所以一直访问不了。一直想着修复,修复,再修复。谁知道越修复问题越多,局面渐渐地变得不可收拾,就跟现如今香港的局势一样。

现简单讲讲,我是如何在安装升级 OpenSSL-1.1.1c 后一步步把服务器搞砸的。

我为什么要升级 OpenSSL?

最近收到一份服务器检测报告,大概是推销软件服务的。报告主要针对 公司官网 所在服务器,检测出一些关于 ssl 相关的协议漏洞。网上找解决方案,因为这些协议漏洞是早就报出来的,所以直接就有现成的,我还总结(转载)了一篇:常见的服务器 SSL 安全漏洞及修复方案。公司服务器用了 windows server,iis,方案很简单,直接服务器下载一个 IIS Crypto 软件,通过取消相关协议并应用,再重启服务器即可生效。

手痒用 ssllab.com 查看了一下,发现我的服务器也存在 ssl 相关的漏洞,然后按照 apache 服务器的方案去整改。openssl version 查看 openssl 软件版本为 OpenSSL 1.0.1e-fips 11 Feb 2013。其实这已经够用了,但看到软件是 13 年的,还是想升级一下。

升级 OpenSSL 为什么会导致服务器崩溃

本来经过一般波折,按照下面的教程已经升级到了 1.1.1c 版本,但是使用 ssllab 检测问题依然还在,并没有消失。就在想为什么服务器没有生效,是不是 Apache 版本过低了,本来也想过升级 Apache,但一直拖着没去做,这次正好一次性解决。下载最新版本的 Apache 编译压缩包 httpd-2.4.41.tar.gz,配置、编译,不通过,修改,再编译,不通过,再改。好不容易通过了,安装到当前目录下,替换相关启动文件,然后通过 service httpd restart 启动,不成功。

报如下的错误:

httpd: Syntax error on line 155 of /usr/local/apache/conf/httpd.conf: Cannot load modules/libphp7.so into server: /alidata/server/httpd/modules/libphp7.so: undefined symbol: unixd_config

大概原因: libphp7.so 库文件是 php 编译生成的,当时使用了 --with-apxs2=/alidata/server/httpd/bin/apxs 参数,要想该库文件生效,需要重新编译 PHP,重新生成这个库文件。

然后就去备份原来的 PHP 安装目录,重新解压编译,之后就一直卡在 PHP 编译上面。错误信息查看此处升级 OpenSSL 后编译安装 PHP 时提示 libssl 冲突。发现绕了一圈,又回到 ssl 问题上来了。

找了几天,在网上没有找到解决方案。服务器也就一直挂在那边。今天想找 OpenSSL rpm 库,尝试使用 rpm 安装看看的(原版可能 1.0.1e 可能是编译的,也可能是通过 yum 安装的,我想是不是因为编译安装导致相关依赖文件缺失了),找到了Openssl Download for Linux。里面按照系统类别下载不同的 OpenSSL,我发现 centos 6 下对应的下载版本赫然就是 1.0.1e,而 1.1.1c 到 centos 8 之后才有版本提供。这是不是在提示,OpenSSL 存在兼容性问题呢?你表面上修改了 OpenSSL 版本,但是服务器的其他软件的依赖版本依然是 1.0.1e ,这就会导致冲突。

到这只能放弃了,我暂时还没有要升级 centos 的打算,一切恢复原样,重启服务器,好了。


原由

使用 ssllab.com 查看服务器 ssl 方面是否存在漏洞,爆出以下的问题:

This server is vulnerable to the OpenSSL Padding Oracle vulnerability (CVE-2016-2107) and insecure. Grade set to F.

查了一下发现,是 OpenSSL 版本太低所致(openssl version),我的版本是 1.0.1h,而官网最新版本已经到 1.1.1c,是时候升级一波了。

卸载旧版本OpenSSL

# 查看旧版本脚本安装位置
[root@xxx /]# which openssl
/usr/local/bin/openssl
# 移动脚本备份
[root@xxx /]# mv /usr/local/bin/openssl /usr/local/bin/openssl.old
#删除配置文件(/usr/local/ssl 为默认安装目录,旧版本也可能安装在其他目录下面)
[root@xxx /]# rm -rf /usr/local/ssl

CentOS6.10 编译安装 openssl-1.1.1c

1.获取安装包。

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

2.解压。

tar -xzvf openssl-1.1.1c.tar.gz
# 切换到解压目录下
cd openssl-1.1.1c

3.配置。

[root@xxx openssl-1.1.1c]./Configure --help
# 配置参数选项
--openssldir=OPENSSLDIR #配置文件目录,默认是/usr/local/ssl
--prefix=DIR #安装目录,默认为 OPENSSLDIR 目录
[no-]threads #是否编译支持多线程的库。默认支持
[no-]shared #是否生成动态连接库。默认生成

我的配置选项命令是:

[root@xxx openssl-1.1.1c]#./config shared --openssldir=/usr/local/openssl --prefix=/usr/local/openssl

4.编译和安装。

[root@xxx openssl-1.1.1c]# make && make install

设置环境变量

echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -v

设置openssl命令的软链接

ln -s /usr/local/openssl/bin/openssl  /usr/local/bin/openssl

验证是否安装成功

openssl version -a | head -2

转自:CentOS7.6编译安装openssl-1.1.1c

文章目录