文章目录
场景
上篇博客CentOS 7 升级 OpenSSH 9.6 (官方简单步骤)使用 openssh 源码在 CentOS 7 编译了openssh rpm包,但没有升级 OpenSSL。可以通过编译新版 OpenSSL 的方式让 openssh 使用 OpenSSL,本次目标是:
- 编译安装 OpenSSL 1.1.1w,使系统中存在两个OpenSSL(1.0.2k 和 1.1.1w)
- 重新编译 OpenSSH 9.6 rpm包,使用 OpenSSL 1.1.1w
编译 OpenSSL 1.1.1w
OpenSSL 1.1.1w 编译后会安装在/usr/local/openssl111w,需要在config阶段指定目录位置
curl -LO https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz
tar xf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/usr/local/openssl111w
# -j 加快编译速度,一般 -j${CPU核数}
make -j20
安装 OpenSSL 1.1.1w
安装时解决的三个问题:二进制在哪?库在哪?头文件在哪?
安装二进制
在openssl-1.1.1w
目录中执行make install
,新的 OpenSSL 被安装到/usr/local/openssl111w
执行which openssl
和openssl version
,显示openssl仍然是系统自带的1.0.2版
make install
# 安装成功,能看到已安装的openssl
ls -l /usr/local/openssl111w/bin/openssl
# 查找、使用 openssl,依然是老版本
which openssl
openssl version
这是因为系统$PATH中没有/usr/local/openssl111w/bin/
目录,只找到/usr/bin/openssl
。我们需要把新openssl的目录放在$PATH中更靠前的位置。
echo 'PATH=/usr/local/openssl111w/bin:$PATH' > /etc/profile.d/openssl111w.sh
source /etc/profile.d/openssl111w.sh
which openssl
现在新版openssl更早被找到,/etc/profile.d/openssl111w.sh
保证以后所有环境的$PATH中都有新版openssl的目录。
注册库目录
现在执行ldd /usr/local/openssl111w/bin/openssl
会看到缺两个库,原因与上面类似,虽然库已经被编译和安装到/usr/local/openssl111w/lib
目录,仍然需要明确告知系统:来这个位置找库。
echo '/usr/local/openssl111w/lib' > /etc/ld.so.conf.d/openssl-1.1.1w.el7.x86_64.conf
# 添加配置后再次执行ldconfig使配置生效
ldconfig
# 再次执行ldd可以看到已找到缺失的库
ldd /usr/local/openssl111w/bin/openssl
查找头文件
OpenSSL 的头文件被安装在/usr/local/openssl111w/include/
下,编译 OpenSSH 时需要明确指定这个目录 ,OpenSSH 必须能找到openssl/opensslv.h
重新编译 OpenSSH-9.6
使用OpenSSL
回到 OpenSSH-9.6 编译打包位置/root/rpmbuild/SPECS/
,读一下spec文件,OpenSSL 的判断逻辑是:
- 定义变量 without_openssl = 0
- 如果系统版本是 fedora <= 28 或 rhel <= 7,就设置 without_openssl = 1
- 如果 without_openssl = 1,就在 %configure 阶段加 --without-openssl
为了尽可能少做改动,把第3条逻辑改为:如果 without_openssl = 1,就在 %configure 阶段指定刚才编译的 OpenSSL include 目录,即修改openssh.spec
:
%if %{without_openssl}
--without-openssl \
%endif
# 改为
%if %{without_openssl}
--with-ssl-dir=/usr/local/openssl111w/ \
%endif
其他修改
上次编译需要x11-ssh-askpass-1.2.4.1,这个包在字符界面下用不到,需要告诉rpmbuild别费劲编译了。因此在编译时需要传递对应的宏定义 skip_x11_askpass
和 skip_gnome_askpass
另外还有make -j参数,也可以传递宏定义_smp_mflags -j$(nproc)
编译 OpenSSH
rpmbuild -ba \
--define 'skip_x11_askpass 1' \
--define 'skip_gnome_askpass 1' \
--define '_smp_mflags -j$(nproc)' \
openssh.spec
安装 OpenSSH-9.6
安装过程稍有变化,需要分两步:
- 在目标机器上安装 OpenSSL-1.1.1w,可以在编译机器上打tar包,或打成rpm包,这包括:
- /usr/local/openssl111w 整个目录
- /etc/profile.d/openssl111w.sh
- /etc/ld.so.conf.d/openssl-1.1.1w.el7.x86_64.conf
如果用tar包部署 OpenSSL-1.1.1w,安装 OpenSSH-9.6 rpm包时使用rpm -Uvh --nodeps
忽略对 libcrypto.so.1.1 的依赖检查
- 上面步骤编译出的 OpenSSH-9.6 rpm包在
/root/rpmbuild/RPMS/x86_64
目录下,拷到其他机器安装即可
总结
至此已实现 " CentOS 7.x + OpenSSL-1.1.1w + OpenSSH-9.6 ",但仍有很多可以优化的点,包括但不限于:
- 尝试把 OpenSSL-1.1.1w 静态编入 OpenSSH-9.6,以后不需要先安装OpenSSL依赖
- PAM问题修复
- sshd_config优化
以后有时间再写