CentOS 7 升级 OpenSSH 9.6 (使用OpenSSL)


场景

上篇博客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 opensslopenssl version,显示openssl仍然是系统自带的1.0.2版

make install

# 安装成功,能看到已安装的openssl
ls -l /usr/local/openssl111w/bin/openssl

# 查找、使用 openssl,依然是老版本
which openssl
openssl version

查找和使用openssl
这是因为系统$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

修改$PATH
现在新版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

安装过程稍有变化,需要分两步:

  1. 在目标机器上安装 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 的依赖检查
  2. 上面步骤编译出的 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优化

以后有时间再写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值