1. 下载并编译OpenSSL 3.5.6

OpenSSL 3.5.6 是一个重要的安全补丁版本-,请从官方源下载。

# 下载源码

cd /usr/local/src
wget https://www.openssl.org/source/openssl-3.5.6.tar.gz
tar -xzvf openssl-3.5.6.tar.gz
cd openssl-3.5.6

配置、编译与安装

./config --prefix=/usr/local/openssl356 --openssldir=/etc/ssl shared zlib
make -j$(nproc)
make install

配置动态链接器

echo '/usr/local/openssl356/lib' > /etc/ld.so.conf.d/openssl356.conf
ldconfig

报错请尝试以下路径

echo '/usr/local/openssl356/lib64' > /etc/ld.so.conf.d/openssl356.conf
ldconfig
  • --prefix=/usr/local/openssl356:指定安装目录,便于管理和区分多个版本。

  • shared:构建共享库(.so文件),这是大多数应用所依赖的-

2. 验证OpenSSL安装

安装完成后,执行以下命令来验证新版本是否可用。

# 使用完整路径验证版本
/usr/local/openssl356/bin/openssl version
# 期望输出:OpenSSL 3.5.6 <日期>

您也可以设置临时环境变量,让当前会话的 openssl 命令指向新版本,这并非必须。

export PATH=/usr/local/openssl356/bin:$PATH
openssl version

3. 重新编译OpenSSH 10.3p1

这是最关键的步骤。新版OpenSSH需要与新版的OpenSSL库进行链接,才能使用其加密功能-

回到OpenSSH源码目录并清理

cd /usr/local/src/openssh-10.3p1
make clean

重新配置,关键是指定--with-ssl-dir为新OpenSSL的安装路径

./configure \
    --prefix=/usr/local/openssh103 \
    --sysconfdir=/etc/ssh \
    --with-pam \
    --with-ssl-dir=/usr/local/openssl356

编译并安装

make -j$(nproc)
make install

4. 覆盖系统命令并重启服务

编译完成后,将新的二进制文件复制到系统路径,并重启SSH服务。

覆盖系统命令

\cp -f /usr/local/openssh103/bin/ssh /usr/bin/ssh
\cp -f /usr/local/openssh103/sbin/sshd /usr/sbin/sshd
\cp -f /usr/local/openssh103/bin/ssh-keygen /usr/bin/ssh-keygen

重启SSH服务

systemctl restart sshd

🔗 检查与验证

完成上述步骤后,需要进行全面验证,确保升级成功且服务正常。

  1. 检查OpenSSH动态链接
    这是验证OpenSSH是否正确链接到新版OpenSSL库的关键。

    ldd /usr/sbin/sshd | grep ssl

    输出应包含新版的库路径:/usr/local/openssl356/lib/libssl.so.3

  2. 测试SSH连接
    务必保持当前的root会话,并另开一个终端,尝试通过SSH登录服务器,确认一切功能正常。

💡 常见问题与解决方案

1. sshd 启动失败,报错 symbol not found

  • 原因:新版OpenSSH仍然动态链接到了系统旧版的OpenSSL库,而非新安装的版本。

  • 解决:请检查 ldd /usr/sbin/sshd | grep ssl 的输出,确认其指向了 /usr/local/openssl356/lib。如果指向错误,请确认在OpenSSH的 ./configure 阶段已正确使用 --with-ssl-dir 参数指定了新库路径,并确保在 make install/usr/sbin/sshd 已被新生成的二进制文件覆盖。

2. 启动时遇到关于 OPENSSL_VERSION_NUMBER 的报错

  • 原因:OpenSSL 3.5.2版本曾存在一个版本号定义问题,可能导致OpenSSH在启动时因版本检查不匹配而报错-。您使用的是3.5.6,此问题通常已被修复。

  • 解决:如果遇到此问题,最直接的解决方法就是确保OpenSSH是在新版OpenSSL(3.5.6)安装之后才进行编译的。这能保证OpenSSH在编译时就获取到正确的版本号。

3. 其他应用无法使用新版OpenSSL库

  • 原因:应用在编译时未找到新版的OpenSSL库。

  • 解决:编译其他依赖OpenSSL的应用前,可以设置环境变量,帮助编译器找到新库:

    export PKG_CONFIG_PATH=/usr/local/openssl356/lib/pkgconfig:$PKG_CONFIG_PATH
    export LD_LIBRARY_PATH=/usr/local/openssl356/lib:$LD_LIBRARY_PATH