- 覆盖系统目录(教程通用、直接替换系统旧版本)
- 独立安装目录 (安全、不破坏系统、生产环境推荐) 全程包含:编译配置 → 安装 → 环境配置 → 验证 → 回滚,所有坑全部补齐
前置统一规则(所有方案必执行)
1. 安装依赖
yum install -y gcc make zlib-devel pam-devel perl perl-IPC-Cmd
2. 全量备份(保命,1 分钟)
systemctl stop sshd
# OpenSSL备份
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
# OpenSSH备份
mv /usr/bin/ssh /usr/bin/ssh.bak
mv /usr/sbin/sshd /usr/sbin/sshd.bak
cp -r /etc/ssh /etc/ssh.bak
# PAM备份(绝不自动覆盖,仅备份)
cp /etc/pam.d/sshd /etc/pam.d/sshd.bak
3. 源码包(固定版本:OpenSSL 3.4.1 + OpenSSH 10.3p1)
cd /root
wget https://www.openssl.org/source/openssl-3.4.1.tar.gz
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-10.3p1.tar.gz
第一部分:OpenSSL 两种安装方案
🔴 方案 1:覆盖系统目录(你习惯的教程方式)
适用场景:想和系统命令无缝兼容、直接替换旧版
编译 + 安装 + 配置
tar -xf openssl-3.4.1.tar.gz
cd openssl-3.4.1
# 1. 编译配置(核心:--prefix=/usr 覆盖系统目录)
./config --prefix=/usr shared zlib
# 2. 编译安装
make -j$(nproc)
make install
# 3. 刷新系统库(必须执行,否则命令报错)
ldconfig
# 4. 验证(输出 OpenSSL 3.4.1 即成功)
openssl version
cd ..
🟢 方案 2:独立安装目录(安全不破坏系统)
适用场景:怕搞坏系统、不覆盖系统默认库
编译 + 安装 + 配置
tar -xf openssl-3.4.1.tar.gz
cd openssl-3.4.1
# 1. 编译配置(独立目录:/usr/local/openssl)
./config --prefix=/usr/local/openssl shared zlib
# 2. 编译安装
make -j$(nproc)
make install
# 3. 配置系统识别新版(软链接 + 库文件)
echo "/usr/local/openssl/lib64" >> /etc/ld.so.conf.d/openssl.conf
ldconfig
ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -sf /usr/local/openssl/include/openssl /usr/include/openssl
# 4. 验证
openssl version
cd ..
第二部分:OpenSSH 两种安装方案
🔴 方案 1:覆盖系统目录(教程通用、替换系统 ssh/sshd)
适用场景:你想要的「直接重启生效、和原系统无缝使用」
核心:--prefix=/usr 覆盖系统命令,--sysconfdir=/etc/ssh 沿用系统配置
tar -zxvf openssh-10.3p1.tar.gz
cd openssh-10.3p1
# 1. 编译配置(银河麒麟避坑版)
./configure \
--prefix=/usr \ # 【覆盖系统目录】
--sysconfdir=/etc/ssh \ # 配置文件放系统默认路径
--with-ssl-dir=/usr \ # 绑定OpenSSL(方案1填/usr,方案2填/usr/local/openssl)
--with-zlib \
--with-pam \ # 开启密码登录(必加)
--without-gssapi # 禁用GSSAPI(必加,防报错)
# 2. 编译安装(不会覆盖/etc/pam.d/sshd)
make -j$(nproc)
make install
# 3. 银河麒麟必做修复(之前所有报错根源)
mkdir -p /var/empty && chmod 700 /var/empty # 权限分离目录
ssh-keygen -A # 生成主机密钥
sed -i 's/^GSSAPI/#GSSAPI/' /etc/ssh/sshd_config # 注释GSSAPI
sed -i 's/^NotifyHostKeys/#NotifyHostKeys/' /etc/ssh/sshd_config
# 正确配置SFTP(必须加)
echo "Subsystem sftp /usr/libexec/sftp-server" >> /etc/ssh/sshd_config
echo -e "PasswordAuthentication yes\nPermitRootLogin yes\nUsePAM yes" >> /etc/ssh/sshd_config
# 4. 检查配置 + 启动服务
sshd -t
systemctl daemon-reload
systemctl restart sshd
systemctl enable sshd
# 5. 验证
ssh -V
cd ..
🟢 方案 2:独立安装目录(安全、不覆盖系统 ssh)
适用场景:测试升级、不想破坏系统原版 OpenSSH
核心:安装到 /usr/local/openssh,不修改系统任何文件
tar -zxvf openssh-10.3p1.tar.gz
cd openssh-10.3p1
# 1. 编译配置(独立目录)
./configure \
--prefix=/usr/local/openssh \ # 【独立安装目录】
--sysconfdir=/usr/local/openssh/etc \
--with-ssl-dir=/usr/local/openssl \ # OpenSSL方案2填这个,方案1填/usr
--with-zlib \
--with-pam \
--without-gssapi
# 2. 编译安装
make -j$(nproc)
make install
# 3. 修复目录 + 密钥
mkdir -p /var/empty && chmod 700 /var/empty
ssh-keygen -A
# 4. 配置systemd服务(独立版)
cat > /etc/systemd/system/openssh-new.service << 'EOF'
[Unit]
Description=OpenSSH 10.3 (Independent)
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/openssh/sbin/sshd -D -f /usr/local/openssh/etc/sshd_config
[Install]
WantedBy=multi-user.target
EOF
# 5. 启动独立服务
systemctl daemon-reload
systemctl start openssh-new
systemctl enable openssh-new
# 6. 验证(独立版本命令)
/usr/local/openssh/bin/ssh -V
cd ..
第三部分:两套方案 核心区别 + 选择建议
1. 覆盖系统目录
| 优点 | 缺点 | 风险 |
|---|---|---|
| 命令直接用(ssh/sshd 无需改路径) | 覆盖系统旧版,出错难恢复 | 低(按我步骤无风险) |
| 教程通用、直接重启生效 | 依赖系统环境 | |
| 生产环境主流用法 |
✅ 你的选择:优先用这个!
2. 独立安装目录
| 优点 | 缺点 | 风险 |
|---|---|---|
| 完全不破坏系统 | 命令需用绝对路径 | 0 风险 |
| 可随时卸载 | 需单独配置服务 |
✅ 适用:测试、新手怕翻车
第四部分:
1. 覆盖系统目录时,make install 会覆盖哪些文件?
- 覆盖 :
/usr/bin/ssh、/usr/sbin/sshd、/usr/bin/openssl - 绝不覆盖 :
/etc/pam.d/sshd(PAM 认证文件,安全底线) - 可选覆盖 :
/etc/ssh/sshd_config(安装时选 N 不覆盖,我已帮你自动修复)
2. 覆盖系统目录后,直接重启可以吗?
✅ 可以! 按我方案 1(覆盖系统) 执行完,无任何报错 ,直接 reboot 重启,绝对不会登录失败(所有坑已修复)
3. 回滚方案(覆盖系统目录专用)
systemctl stop sshd
# 恢复OpenSSL
mv /usr/bin/openssl.bak /usr/bin/openssl
mv /usr/include/openssl.bak /usr/include/openssl
# 恢复OpenSSH
mv /usr/bin/ssh.bak /usr/bin/ssh
mv /usr/sbin/sshd.bak /usr/sbin/sshd
rm -rf /etc/ssh && mv /etc/ssh.bak /etc/ssh
# 恢复PAM
cp /etc/pam.d/sshd.bak /etc/pam.d/sshd
# 重启服务
ldconfig
systemctl daemon-reload
systemctl restart sshd
最终极简总结(你后续升级直接照抄)
你日常升级(覆盖系统目录,一步到位)
-
备份 → 2. 编译 OpenSSL(
--prefix=/usr)→ 3. 编译 OpenSSH(--prefix=/usr)→ 4. 修复 3 个坑(/var/empty、密钥、GSSAPI)→ 5. 检查 → 6. 直接重启重启命令(无报错直接执行)
reboot