当前 openssl 版本为 OpenSSL 1.1.1k 版,因涉及Openssl 拒绝服务漏洞(CVE-2011-1473)因此需要升级 openssl 至 openssl3.1 版本;升级 openssh 至 OpenSSH_9.5p1 版本。
当前环境版本如图:
1、编译 OpenSSL 3.1.3 rpm 包
首先下载需要编译的安装包
wget https://www.openssl.org/source/openssl-3.1.3.tar.gz
安装相关工具
yum -y groupinstall 'Development Tools'
执行编译脚本(脚本内容如下)
#!/bin/bash
# Падаем сразу, если возникли какие-то ошибки
set -e
# Выводим, то , что делаем
set -v
mkdir ~/openssl && cd ~/openssl
yum -y install \
curl \
which \
make \
gcc \
perl \
perl-WWW-Curl \
rpm-build \
perl-IPC-Cmd
yum -y remove openssl
# Get openssl tarball
curl -O --silent https://www.openssl.org/source/openssl-3.1.3.tar.gz
# SPEC file
cat << 'EOF' > ~/openssl/openssl3.spec
Summary: OpenSSL 3.1.3 for Centos
Name: openssl
Version: %{?version}%{!?version:3.1.3}
Release: 1%{?dist}
Obsoletes: %{name} <= %{version}
Provides: %{name} = %{version}
URL: https://www.openssl.org/
License: GPLv2+
Source: https://www.openssl.org/source/%{name}-%{version}.tar.gz
BuildRequires: make gcc perl perl-WWW-Curl
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
%global openssldir /usr/openssl
%description
https://github.com/philyuchkoff/openssl-RPM-Builder
OpenSSL RPM for version 3.1.3 on CentOS
%package devel
Summary: Development files for programs which will use the openssl library
Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
%description devel
OpenSSL RPM for version 3.1.3 on CentOS (development package)
%prep
%setup -q
%build
./config --prefix=%{openssldir} --openssldir=%{openssldir}
make
%install
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}
%make_install
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_libdir}
ln -sf %{openssldir}/lib64/libssl.so.3 %{buildroot}%{_libdir}
ln -sf %{openssldir}/lib64/libcrypto.so.3 %{buildroot}%{_libdir}
ln -sf %{openssldir}/bin/openssl %{buildroot}%{_bindir}
%clean
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}
%files
%{openssldir}
%defattr(-,root,root)
/usr/bin/openssl
/usr/lib64/libcrypto.so.3
/usr/lib64/libssl.so.3
%files devel
%{openssldir}/include/*
%defattr(-,root,root)
%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig
EOF
mkdir -p /root/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
cp ~/openssl/openssl3.spec /root/rpmbuild/SPECS/openssl.spec
mv openssl-3.1.3.tar.gz /root/rpmbuild/SOURCES
cd /root/rpmbuild/SPECS && \
rpmbuild \
-D "version 3.1.3" \
--nodebuginfo \
-ba openssl.spec
如图:脚本执行结束会在 /root/rpmbuild/RPMS 目录下生成 rpm 包
2、编译 OpenSSH Rpm 安装包
下载需要编译的版本包,这里以 openssh-9.5p1.tar.gz 版本为例
# 安装依赖包
yum install rpm-build zlib-devel openssl-devel \
gcc perl-devel pam-devel xmkmf libXt-devel gtk2-devel make -y
# 创建工作目录,拷贝源码包到目录
mkdir -p /root/rpmbuild/SOURCES
mkdir -p /root/rpmbuild/SPECS/
cp openssh-9.5p1.tar.gz x11-ssh-askpass-1.2.4.1.tar.gz /root/rpmbuild/SOURCES
# 解压源码包 拷贝openssh.spec进行修改
tar -xvf openssh-9.5p1.tar.gz
cp openssh-9.5p1/contrib/redhat/openssh.spec /root/rpmbuild/SPECS/
vi openssh.spec
注释 #BuildRequires: openssl-devel < 1.1
# 制作 rpm 包
rpmbuild -ba openssh.spec
制作完成如图:
3、打包 ssh 、ssl 的 rpm 包
4、测试升级 openssh 、openssl
上传上文的 openssh-9.5p1-x86_64.tar.gz 、openssl-3.1.3.tar.gz 安装包
备份文件、检查当前 ssh ssl 版本
# 备份 ssh 配置文件
mkdir /etc/sshconfig_backup
cp /etc/ssh/sshd_config /etc/sshconfig_backup/
cp /etc/pam.d/sshd /etc/sshconfig_backup/pam.d_sshd
# 备份库文件
cp /usr/lib64/libcrypto.so.1.1.1k /root/
cp /usr/lib64/libssl.so.1.1.1k /root/
# 检查当前安装版本和已安装的rpm包
ssh -V
rpm -qa |grep openssh
rpm -qa |grep openssl
升级 openssh 、openssl 版本
# 解压 openssh openssl 压缩包
tar -xvf openssh-9.5p1.tar.gz
tar -xvf openssl-3.1.3.tar.gz
# 卸载已安装的 openssl openssh
rpm -e openssh-clients-8.0p1-16.el8.x86_64 openssh-server-8.0p1-16.el8.x86_64 openssh-8.0p1-16.el8.x86_64 openssl-1.1.1k-7.el8_6.x86_64 --nodeps
# 安装 openssh openssl
rpm -ivh openssh-9.5p1-1.el8.x86_64.rpm openssh-clients-9.5p1-1.el8.x86_64.rpm openssh-server-9.5p1-1.el8.x86_64.rpm openssl-3.1.3-1.el8.x86_64.rpm --nodeps --force
# 还原配置文件
cp /etc/sshconfig_backup/sshd_config /etc/ssh/sshd_config
cp /etc/sshconfig_backup/pam.d_sshd /etc/pam.d/sshd
# 检查是否允许ROOT登陆
cat /etc/ssh/sshd_config | grep PermitRootLogin
cd /etc/ssh
chmod 600 ssh_host_ecdsa_key
chmod 600 ssh_host_rsa_key
chmod 600 ssh_host_ed25519_key
systemctl restart sshd
检查 openssh openssl 版本是否升级成功
5、编译过程报错整理
1、编译 ssh 报错:configure: error: PAM headers not found
yum -y install pam-devel
2、编译 ssh 报错:configure: error: *** working libcrypto not found, check config.log
缺少 libcrypto 包,解决办法,寻找 libcrypto 包,可在openssl下找lib,若是存在 libcrypto 包,则检查一下openssl库的路径填的对不对
# 修改 openssh.spec 或添加指定 openssl 位置
参数:
--with-ssl-dir=/usr/openssl/
6、最后
注意:本文测试升级过程是在测试环境里经过测试验证的,由于实际各种环境有所区别,因此请各位根据自己实际情况,测试好之后再上生产环境,若因自己操作不当,造成服务器失联请自行承担后果!
7、参考链接
本文编写过程中参考的相关官网及各位大佬文章的参考链接,感谢提供相关指导!
OpenSSL 官网
OpenSSL rpm builder for CentOS 7 - build latest OpenSSL binary
centos 7 制作openssh8.7/8.8/8.9/9.0/9.1/9.2/9.3 p1 rpm包升级——筑梦之路