文章目录
- [OpenSSL 3.6.0 & OpenSSH 10.0p2 升级详细配置手册](#OpenSSL 3.6.0 & OpenSSH 10.0p2 升级详细配置手册)
-
- 一、环境说明
- 二、前期准备工作
-
- [1. 备份现有 OpenSSH/OpenSSL 配置及程序](#1. 备份现有 OpenSSH/OpenSSL 配置及程序)
- [2. 安装编译依赖包](#2. 安装编译依赖包)
- [3. 上传源码包并解压](#3. 上传源码包并解压)
- [4. 关闭防火墙及 SELinux(临时,避免升级过程中拦截)](#4. 关闭防火墙及 SELinux(临时,避免升级过程中拦截))
- [三、升级 OpenSSL 3.6.0](#三、升级 OpenSSL 3.6.0)
-
- [1. 配置编译参数](#1. 配置编译参数)
- [2. 编译并安装](#2. 编译并安装)
- [3. 配置系统环境变量及动态链接库](#3. 配置系统环境变量及动态链接库)
-
- [(1)配置环境变量,让系统优先识别新的 OpenSSL](#(1)配置环境变量,让系统优先识别新的 OpenSSL)
- [(2)配置动态链接库缓存,让系统识别新的 OpenSSL 库](#(2)配置动态链接库缓存,让系统识别新的 OpenSSL 库)
- [4. 验证 OpenSSL 升级是否成功](#4. 验证 OpenSSL 升级是否成功)
- [四、升级 OpenSSH 10.0p2](#四、升级 OpenSSH 10.0p2)
-
- [1. 停止原有 sshd 服务](#1. 停止原有 sshd 服务)
- [2. 配置 OpenSSH 编译参数(关联新安装的 OpenSSL)](#2. 配置 OpenSSH 编译参数(关联新安装的 OpenSSL))
- [3. 编译并安装](#3. 编译并安装)
- [4. 替换系统原有 OpenSSH 程序](#4. 替换系统原有 OpenSSH 程序)
- [5. 恢复 / 调整 sshd 配置文件](#5. 恢复 / 调整 sshd 配置文件)
- [6. 重建 sshd 系统服务文件(兼容 systemd)](#6. 重建 sshd 系统服务文件(兼容 systemd))
- [7. 重新加载 systemd 并启动 sshd 服务](#7. 重新加载 systemd 并启动 sshd 服务)
- [8. 验证 OpenSSH 升级是否成功](#8. 验证 OpenSSH 升级是否成功)
- 五、后续优化与验证
-
- [1. 恢复防火墙(如需启用)](#1. 恢复防火墙(如需启用))
- [2. 验证 SSH 功能完整性](#2. 验证 SSH 功能完整性)
- [3. 清理源码及临时文件](#3. 清理源码及临时文件)
- 六、回滚方案(升级失败时使用)
- 七、报错信息
-
- [1. 执行 `make install` 提示权限太高](#1. 执行
make install提示权限太高) - [2.执行 ssh -V 显示openssl版本不对](#2.执行 ssh -V 显示openssl版本不对)
- [1. 执行 `make install` 提示权限太高](#1. 执行
- 八、注意事项
OpenSSL 3.6.0 & OpenSSH 10.0p2 升级详细配置手册
一、环境说明
- 操作系统:TencentOS Server 3.3 (Final)(兼容 RHEL 8/CentOS 8/麒麟系列)
- 目标升级版本:OpenSSL 3.6.0、OpenSSH 10.0p2
- 升级方式:源码编译安装(稳定性更高,可自定义功能)
- 核心原则:先升级 OpenSSL(OpenSSH 依赖 OpenSSL),再升级 OpenSSH,全程保留备份,避免断连(安装teklnet-server,使用telnet 登录)
二、前期准备工作
1. 备份现有 OpenSSH/OpenSSL 配置及程序
bash
# 备份sshd配置文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)
# 备份ssh客户端配置
cp /etc/ssh/ssh_config /etc/ssh/ssh_config.bak.$(date +%Y%m%d)
# 备份现有openssh相关程序
mkdir -p /backup/openssh_old
cp /usr/sbin/sshd /usr/bin/ssh /usr/bin/ssh-keygen /backup/openssh_old/
# 备份现有openssl相关程序
mkdir -p /backup/openssl_old
cp /usr/bin/openssl /usr/lib64/libssl* /usr/lib64/libcrypto* /backup/openssl_old/
2. 安装编译依赖包
TencentOS 3.3 基于 RHEL 8,使用 dnf 安装依赖:
bash
# 安装基础编译工具及依赖包
dnf install -y gcc gcc-c++ make perl-CPAN perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker zlib zlib-devel tar bzip2 lksctp-tools-devel openssl openssl-devel pam-devel
3. 上传源码包并解压
将 openssl-3.6.0.tar.gz 和 openssh-10.0p2.tar.gz 上传至服务器 /usr/local/src 目录,然后解压:
bash
# 进入源码目录
cd /usr/local/src
# 下载安装包
wget https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.0p2.tar.gz
# 解压OpenSSL
tar -zxvf openssl-3.6.0.tar.gz
# 解压OpenSSH
tar -zxvf openssh-10.0p2.tar.gz
# 重命名目录(方便操作,可选)
mv openssl-3.6.0 openssl
mv openssh-10.0p1/ openssh
4. 关闭防火墙及 SELinux(临时,避免升级过程中拦截)
bash
# 临时关闭firewalld
systemctl stop firewalld
systemctl disable firewalld
# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux(可选,如需永久关闭,修改配置文件)
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
三、升级 OpenSSL 3.6.0
1. 配置编译参数
bash
# 进入OpenSSL源码目录
cd /usr/local/src/openssl
# 配置编译参数(指定安装路径,启用共享库,兼容更多功能)
./config --prefix=/usr/local/openssl \
--openssldir=/usr/local/openssl \
shared \
zlib \
enable-camellia \
enable-rfc3779 \
enable-sctp \
enable-tls1_3 \
enable-ec_nistp_64_gcc_128
--prefix:指定 OpenSSL 安装根目录shared:编译生成共享库(OpenSSH 需要依赖共享库)enable-tls1_3:启用 TLS 1.3 协议(更高安全性)- 其他参数:启用额外加密算法,增强兼容性
2. 编译并安装
bash
# 编译(-j 后面跟CPU核心数,加快编译速度,如4核则-j4)
make -j $(nproc)
# 安装(安装至指定路径)
make install
3. 配置系统环境变量及动态链接库
(1)配置环境变量,让系统优先识别新的 OpenSSL
bash
# 编辑环境变量配置文件
vim /etc/profile
# 在文件末尾添加以下内容
export OPENSSL_HOME=/usr/local/openssl
export PATH=$OPENSSL_HOME/bin:$PATH
export LD_LIBRARY_PATH=$OPENSSL_HOME/lib64:$LD_LIBRARY_PATH
# 生效环境变量
source /etc/profile
(2)配置动态链接库缓存,让系统识别新的 OpenSSL 库
bash
# 创建动态链接库配置文件
echo "/usr/local/openssl/lib64" > /etc/ld.so.conf.d/openssl-3.6.0.conf
# 更新动态链接库缓存
ldconfig
# 备份旧openssl版本
mv /usr/bin/openssl /usr/bin/openssl.bak
# 软连接
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
ls -ld /usr/include/openssl
4. 验证 OpenSSL 升级是否成功
bash
# 查看OpenSSL版本
openssl version
# 预期输出:OpenSSL 3.6.0 xx XXX xxxx
# 验证动态链接库
ldd $(which openssl)
# 确认输出中包含 /usr/local/openssl/lib64/ 路径下的库文件
四、升级 OpenSSH 10.0p2
1. 停止原有 sshd 服务
bash
# 停止sshd服务
systemctl stop sshd
# 确认服务已停止
systemctl status sshd
2. 配置 OpenSSH 编译参数(关联新安装的 OpenSSL)
bash
# 进入OpenSSH源码目录
cd /usr/local/src/openssh
# 配置编译参数(指定OpenSSL路径,启用PAM/SELINUX等功能)
./configure --prefix=/usr/local/openssh \
--sysconfdir=/etc/ssh \
--with-openssl=/usr/local/openssl \
--with-zlib \
--with-pam \
--with-selinux \
--with-kerberos5 \
--enable-ssh1 \
--enable-ssh-agent \
--enable-tcp-forwarding \
--enable-X11-forwarding \
--enable-password-auth \
--enable-pubkey-auth
--prefix:OpenSSH 安装根目录--sysconfdir:指定配置文件存放路径(与系统原有路径一致,方便兼容)--with-openssl:指定新安装的 OpenSSL 路径(关键参数,必须配置)--with-pam:启用 PAM 认证(系统用户密码登录依赖)--with-selinux:启用 SELinux 兼容--enable-password-auth/--enable-pubkey-auth:启用密码认证和公钥认证
3. 编译并安装
bash
# 编译(-j 后跟CPU核心数,加快编译)
make -j $(nproc)
# 安装
make install
4. 替换系统原有 OpenSSH 程序
bash
# 备份并替换系统级ssh相关程序
\cp -f /usr/local/openssh/bin/ssh /usr/bin/ssh
\cp -f /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
\cp -f /usr/local/openssh/sbin/sshd /usr/sbin/sshd
\cp -f /usr/local/openssh/bin/ssh-agent /usr/bin/ssh-agent
\cp -f /usr/local/openssh/bin/ssh-add /usr/bin/ssh-add
- 注意:使用
\cp避免别名干扰,强制覆盖原有程序
5. 恢复 / 调整 sshd 配置文件
bash
# 还原之前备份的sshd配置(如需自定义,可手动修改)
cp /etc/ssh/sshd_config.bak.$(date +%Y%m%d) /etc/ssh/sshd_config
# 关键配置检查(确保可登录,避免断连)
vim /etc/ssh/sshd_config
# 确保以下配置项开启(无则添加,有则修改)
PermitRootLogin yes # 允许root登录(如需禁止,后续可改为no)
PasswordAuthentication yes # 允许密码登录
PubkeyAuthentication yes # 允许公钥登录
Port 22 # 保持默认22端口(如需修改,先确保端口开放)
UsePAM yes # 启用PAM认证
6. 重建 sshd 系统服务文件(兼容 systemd)
TencentOS 3.3 使用 systemd 管理服务,需要重新配置 sshd 服务文件:
bash
# 删除原有sshd服务文件,最好先备份。
rm -f /usr/lib/systemd/system/sshd.service
# 创建新的sshd服务文件
vim /usr/lib/systemd/system/sshd.service
在文件中写入以下内容:
ini
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
7. 重新加载 systemd 并启动 sshd 服务
运行
bash
# 重新加载systemd配置
systemctl daemon-reload
# 启动sshd服务
systemctl start sshd
# 设置开机自启
systemctl enable sshd
# 验证服务状态
systemctl status sshd
8. 验证 OpenSSH 升级是否成功
bash
# 查看ssh版本
ssh -V
# 预期输出:OpenSSH_10.0p2, OpenSSL 3.6.0 xx XXX xxxx
# 查看sshd版本
sshd -V
# 预期输出:OpenSSH_10.0p2, OpenSSL 3.6.0 xx XXX xxxx
# 远程测试登录(务必新开一个终端测试,避免当前终端断连无法恢复)
# 从另一台机器执行:ssh root@你的服务器IP
五、后续优化与验证
1. 恢复防火墙(如需启用)
bash
# 启动firewalld并开放22端口
systemctl start firewalld
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --reload
# 设置开机自启
systemctl enable firewalld
2. 验证 SSH 功能完整性
bash
# 测试密码登录
ssh root@localhost
# 测试公钥登录(如有配置公钥)
ssh root@localhost
# 测试端口转发、X11转发(如需使用)
ssh -L 8080:localhost:80 root@localhost
3. 清理源码及临时文件
bash
# 清理编译残留
cd /usr/local/src/openssl && make clean
cd /usr/local/src/openssh && make clean
# 保留源码包(便于后续重装),删除解压后的源码目录(可选)
# rm -rf /usr/local/src/openssl /usr/local/src/openssh
六、回滚方案(升级失败时使用)
若升级后 SSH 无法连接或功能异常,立即通过控制台(云服务器 VNC)登录服务器,执行以下回滚操作:
bash
# 停止当前sshd服务
systemctl stop sshd
# 恢复原有OpenSSL程序
\cp -f /backup/openssl_old/* /usr/bin/
\cp -f /backup/openssl_old/lib* /usr/lib64/
# 恢复原有OpenSSH程序
\cp -f /backup/openssh_old/* /usr/sbin/
\cp -f /backup/openssh_old/* /usr/bin/
# 恢复原有sshd配置
\cp -f /etc/ssh/sshd_config.bak.$(date +%Y%m%d) /etc/ssh/sshd_config
# 重新启动sshd服务
systemctl daemon-reload
systemctl start sshd
# 恢复环境变量(删除新增的OpenSSL配置)
sed -i '/OPENSSL_HOME/d' /etc/profile
sed -i '/openssl\/lib64/d' /etc/profile
source /etc/profile
# 删除OpenSSL动态链接库配置
rm -f /etc/ld.so.conf.d/openssl-3.6.0.conf
ldconfig
七、报错信息
1. 执行 make install 提示权限太高
- 在
openssh执行make install
shell
/usr/local/openssh/sbin/sshd -t -f /etc/ssh/sshd_config
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0640 for '/etc/ssh/ssh_host_rsa_key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Unable to load host key "/etc/ssh/ssh_host_rsa_key": bad permissions
Unable to load host key: /etc/ssh/ssh_host_rsa_key
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0640 for '/etc/ssh/ssh_host_ecdsa_key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Unable to load host key "/etc/ssh/ssh_host_ecdsa_key": bad permissions
Unable to load host key: /etc/ssh/ssh_host_ecdsa_key
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0640 for '/etc/ssh/ssh_host_ed25519_key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Unable to load host key "/etc/ssh/ssh_host_ed25519_key": bad permissions
Unable to load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.
make: [Makefile:428:check-config] 错误 1 (已忽略)
解决方案:
shell
[root@TencentOS openssh]# ll /etc/ssh/ssh_host_*
-rw-r-----. 1 root ssh_keys 492 12月 10 13:06 /etc/ssh/ssh_host_ecdsa_key
-rw-r--r--. 1 root root 162 12月 10 13:06 /etc/ssh/ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys 387 12月 10 13:06 /etc/ssh/ssh_host_ed25519_key
-rw-r--r--. 1 root root 82 12月 10 13:06 /etc/ssh/ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys 2578 12月 10 13:06 /etc/ssh/ssh_host_rsa_key
-rw-r--r--. 1 root root 554 12月 10 13:06 /etc/ssh/ssh_host_rsa_key.pub
[root@TencentOS openssh]# chmod 0600 /etc/ssh/ssh_host_*
[root@TencentOS openssh]# /usr/local/openssh/sbin/sshd -t -f /etc/ssh/sshd_config
[root@TencentOS openssh]#
2.执行 ssh -V 显示openssl版本不对
shell
[root@TencentOS ~]# ssh -V
OpenSSH_10.0p2, OpenSSL 1.1.1k FIPS 25 Mar 2021
[root@TencentOS ~]#
[root@TencentOS ~]# openssl version
OpenSSL 3.6.0 1 Oct 2025 (Library: OpenSSL 3.6.0 1 Oct 2025)
[root@TencentOS ~]#
解决方案:强制绑定新版库(分步执行,必生效)
步骤 1:重新配置环境变量(确保全局优先识别新版 OpenSSL)
shell
# 重新加载并验证环境变量
source /etc/profile
# 验证新版 openssl 路径优先级(必须输出 /usr/local/openssl/bin/openssl)
which openssl
# 验证新版库路径(必须输出 /usr/local/openssl/lib64)
echo $LD_LIBRARY_PATH
步骤 2:彻底清理 OpenSSH 旧编译残留(关键,避免旧配置干扰)
shell
cd /usr/local/src/openssh
# 彻底清理所有旧编译文件(比 make clean 更彻底)
make clean && make distclean
# 删除旧配置生成的文件
rm -f config.cache config.log config.status
步骤 3:强制指定新版库路径编译 OpenSSH(核心命令,必加 rpath)
使用 CFLAGS(头文件路径)、LDFLAGS(库文件路径 + 运行时路径)强制绑定新版 OpenSSL,解决依赖问题:
shell
CFLAGS="-I/usr/local/openssl/include" \
LDFLAGS="-L/usr/local/openssl/lib64 -Wl,-rpath=/usr/local/openssl/lib64" \
./configure --prefix=/usr/local/openssh \
--sysconfdir=/etc/ssh \
--with-openssl=/usr/local/openssl \
--with-zlib \
--with-pam \
--with-selinux \
--with-kerberos5 \
--enable-ssh1 \
--enable-ssh-agent \
--enable-tcp-forwarding \
--enable-X11-forwarding \
--enable-password-auth \
--enable-pubkey-auth
- 关键参数
--Wl,-rpath=/usr/local/openssl/lib64:将新版 OpenSSL 库路径写入编译后的ssh程序中,确保程序运行时能自动找到新版库,不再依赖旧库; - 其余参数保持不变,确保 OpenSSH 功能完整;
- 若仍提示头文件不匹配,可在末尾追加
--without-openssl-header-check(临时规避,优先保证编译成功)
步骤 4:编译 + 安装 + 覆盖系统 ssh 程序
shell
# 编译(按 CPU 核心数加速,避免卡顿)
make -j $(nproc)
# 安装(覆盖 OpenSSH 安装目录)
make install
# 强制覆盖系统级 ssh/sshd 程序(核心,替换旧版依赖的程序)
\cp -f /usr/local/openssh/bin/ssh /usr/bin/ssh
\cp -f /usr/local/openssh/bin/ssh-keygen /usr/bin/ssh-keygen
\cp -f /usr/local/openssh/sbin/sshd /usr/sbin/sshd
\cp -f /usr/local/openssh/bin/ssh-agent /usr/bin/ssh-agent
# 重启 sshd 服务,让新程序生效
systemctl restart sshd
步骤 5:验证是否彻底解决
shell
# 1. 查看 ssh 版本(应显示 OpenSSL 3.6.0)
ssh -V
# 预期输出:OpenSSH_10.0p2, OpenSSL 3.6.0 1 Oct 2025
# 2. 查看 ssh 依赖的库(应指向新版 OpenSSL 库路径)
ldd $(which ssh) | grep -E "libssl|libcrypto"
# 预期输出(关键:显示 libssl.so.3 和 libcrypto.so.3,路径为 /usr/local/openssl/lib64):
# libssl.so.3 => /usr/local/openssl/lib64/libssl.so.3 (0x00007fxxxxxx)
# libcrypto.so.3 => /usr/local/openssl/lib64/libcrypto.so.3 (0x00007fxxxxxx)
# 3. 验证 sshd 版本
sshd -V
# 预期输出:OpenSSH_10.0p2, OpenSSL 3.6.0 1 Oct 2025
核心总结
- 问题根源:
ssh编译时未彻底脱离旧版 OpenSSL 库,运行时硬依赖libcrypto.so.1.1,与系统新版openssl程序无关; - 解决关键:彻底屏蔽旧版库 / 头文件 + 编译时强制指定新版路径(含
rpath) + 覆盖系统ssh程序; - 验证标准:
ssh -V显示 3.6.0,且ldd输出指向/usr/local/openssl/lib64下的新版库,即为成功。
八、注意事项
- 升级前务必通过云服务器控制台(VNC)预留登录通道,避免 SSH 断连无法恢复。
- 源码编译时,
-j参数请根据服务器 CPU 核心数调整(如 2 核填-j2,8 核填-j8),避免编译资源耗尽。 - OpenSSL 3.6.0 为新版 LTS 版本,若需兼容旧程序,可保留原有 OpenSSL 路径,通过环境变量指定优先级。
- OpenSSH 10.0p2 禁用了部分弱加密算法,若旧客户端无法连接,可在
sshd_config中添加Ciphers aes128-cbc,aes192-cbc,aes256-cbc启用弱加密(不推荐,建议升级客户端)。 - 升级后建议定期备份
sshd_config和 OpenSSL/OpenSSH 程序,便于后续故障排查。