如何使mod_ssl指向不同的openssl目录而不是apache中的默认目录?



这个问题是因为原始的openssl版本没有通过漏洞扫描,因此我需要升级apache centos 7上的openssl包,我正在使用httpd。我花了一些时间后有一些观察

  1. 默认的openssl版本是openssl 1.0.2k-fips,这是mod_ssl的默认openssl版本,而mod_ssl又依赖于httpd 2.4.6-97.el7.centos。所以当我yum安装httpd时,mod_ssl会自动指向openssl版本

  2. 我遵循https://gist.github.com/fernandoaleman/5459173e24d59b45ae2cfc618e20fe06中的指导方针我安装了3.0.0版本,而不是1.1.1版本,其他命令与提到的指南相同,我通过运行openssl version检查了升级后的openssl版本,输出是正确的,但是当我向服务器发送请求时,响应头仍然显示原始版本:Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips mod_wsgi/4.5.18 Python/3.6

  3. 这是当我在/usr/lib64/httpd/modules folderldd mod_ssl.so时的输出:

linux-vdso.so.1 =>  (0x00007ffd44ddd000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007fe07f09c000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fe07ec39000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe07ea1d000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe07e819000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe07e44b000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fe07e1fe000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fe07df15000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fe07dd11000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fe07dade000)
libz.so.1 => /lib64/libz.so.1 (0x00007fe07d8c8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe07f545000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fe07d6b8000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fe07d4b4000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fe07d29a000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fe07d073000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fe07ce11000)

我知道这是一个依赖关系问题,mod_ssl没有指向新安装的openssl 3.0.0,所以有没有办法使mod_ssl指向新的openssl版本?或者我可以将openssl 3.0.0安装到mod_ssl指向的默认目录?(我不想手动安装httpd,因为我不想破坏依赖关系)我是一个初学者的服务器的东西,如果你们能给我一个帮助,我很感激,谢谢

我终于解决了这个问题,它相当繁琐,下面是我解决这个问题的步骤:

  1. 备份所有相关文件,这在后面的步骤中非常有用,您可以先使用rpm -ql httpd,rpm -ql mod_ssl,查看所有已安装的文件路径并相应地备份,当然应该首先考虑主配置文件夹(在我的情况下:/etc/httpd),最好备份mod_ssl配置和文件,因为我们需要稍后自己创建ssl.conf,它需要备份配置和文件。卸载服务器上所有httpd相关文件
  2. 在Centos7上更新openssl到3.0,默认安装的openssl文件夹是:/usr/local/ssl从源代码编译Apache HTTPD,您可以按照Bogdan Stoica上面提到的步骤(非常有用的信息,我稍微改变了命令),使用以下命令:
./configure 
--build=x86_64-redhat-linux-gnu 
--host=x86_64-redhat-linux-gnu 
--disable-dependency-tracking 
--localstatedir=/var 
--sharedstatedir=/var/lib 
--mandir=/usr/share/man 
--infodir=/usr/share/info 
--prefix=/etc/httpd 
--exec-prefix=/usr 
--bindir=/usr/
--sbindir=/usr/sbin 
--libdir=/usr/lib64 
--sysconfdir=/etc/httpd/conf 
--includedir=/usr/include/httpd
--libexecdir=/usr/lib64/httpd/modules
--datadir=/usr/share/httpd 
--with-installbuilddir=/usr/lib64/httpd/build 
--enable-mpms-shared=all 
--with-apr=/usr 
--with-apr-util=/usr 
--enable-suexec 
--with-suexec 
--enable-suexec-capabilities 
--with-suexec-caller=apache 
--with-suexec-oot=/var/
--without-suexec-logfile 
--with-suexec-syslog 
--with-suexec-bin=/usr/sbin/suexec 
--with-suexec-uidmin=500 
--with-suexec-gidmin=100 
--enable-pie --with-pcre 
--enable-mods-shared=all 
--enable-ssl 
--with-ssl=/usr/local
--enable-proxy 
--enable-cache 
--enable-disk-cache 
--enable-ldap 
--enable-authnz-ldap 
--enable-cgid 
--enable-cgi 
--enable-authn-anon 
--enable-authn-alias 
--disable-imag

请注意,它是--with-ssl=/usr/local而不是--with-ssl=/usr/local/ssl,并且安装的httpd路径与yum install中的路径不完全相同

  1. 检查httpd -v是否安装了新的HTTPD,如果没有,请停在这里

  2. 检查mod_ssl。so通过使用ldd /usr/lib64/httpd/modules/mod_ssl.so指向新的openssl,下面是输出:

linux-vdso.so.1 =>  (0x00007ffc73775000)
libssl.so.3 => /usr/local/lib64/libssl.so.3 (0x00007f85b9040000)
libcrypto.so.3 => /usr/local/lib64/libcrypto.so.3 (0x00007f85b89d4000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f85b87b8000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f85b85b4000)
libc.so.6 => /lib64/libc.so.6 (0x00007f85b81e6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f85b9536000)

如果与原mod_ssl.so文件相比没有变化,请在此停止。

  1. 编辑/etc/httpd/httpd.conf,替换为备份的httpd.conf,看看缺少什么文件,在这一步中需要一些cnp操作(在我的情况下,与/conf.d/*.conf相关的一些文件)

然后它就完成了,所以基本上让mod_ssl指向不同的openssl的简单方法是从指定的openssl目录下编译httpd,但需要小心备份,如果你想要一个更好的解决方案,那么我认为找到与yum install完全相同的配置将有利于一致性问题。

假设您已经从官方centos存储库安装了apache + mod_ssl + openssl,您可以这样做:

OpenSSL:

cd /opt/
wget https://ftp.openssl.org/source/openssl-1.1.1k.tar.gz
tar zxvf openssl-1.1.1k.tar.gz
cd /opt/openssl-1.1.1k
./config -fpic shared
make -j4
make install

对于Apache(您可能使用较新的版本,我只是从官方存储库中获取了相同的版本):

cd /opt
wget https://dlcdn.apache.org/httpd/httpd-2.4.53.tar.gz
tar zxvf httpd-2.4.53.tar.gz
cd /opt/httpd-2.4.53
./configure --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --program-prefix= --disable-dependency-tracking --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/sh--includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --prefix=/etc/httpd --exec-prefix=/usr --bindir=/usr/--sbindir=/usr/sbin --mandir=/usr/share/man --libdir=/usr/lib64 --sysconfdir=/etc/httpd/conf --includedir=/usr/include/httpd --libexecdir=/usr/lib64/httpd/modules --datadir=/usr/share/httpd --enable-layout=Fed--with-installbuilddir=/usr/lib64/httpd/build --enable-mpms-shared=all --with-apr=/usr --with-apr-util=/usr --enable-suexec --with-suexec --enable-suexec-capabilities --with-suexec-caller=apache --with-suexec-oot=/var/--without-suexec-logfile --with-suexec-syslog --with-suexec-bin=/usr/sbin/suexec --with-suexec-uidmin=500 --with-suexec-gidmin=100 --enable-pie --with-pcre --enable-mods-shared=all --enable-ssl --with-ssl --die-distca--enable-proxy --enable-cache --enable-disk-cache --enable-ldap --enable-authnz-ldap --enable-cgid --enable-cgi --enable-authn-anon --enable-authn-alias --disable-imag
make -j4
make install
systemctl restart httpd

基本上它会从源代码编译Apache, mod_ssl也是如此,它会用你刚刚编译的文件替换默认文件。

在我的centos7 linux机器上测试:

[Tue May 17 12:13:19.777713 2022] [mpm_prefork:notice] [pid 3179] AH00163: Apache/2.4.53 (Unix) OpenSSL/1.1.1k configured -- resuming normal operations

最新更新