本文最后更新于16 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
1.安装编译依赖包
apt install gcc make zlib1g-dev libpam0g-dev libkrb5-dev libedit-dev -y
2.先升级openssl,再升级openssh
ubuntu20.04 默认openssl版本:OpenSSL 1.1.1f
(我这是22.04)

3.下载OpenSSL
访问openssl官网:https://www.openssl.org/source/
找到最新版本通过wget下载
wget https://github.com/openssl/openssl/releases/download/openssl-3.3.1/openssl-3.3.1.tar.gz
注意:由于OpenSSL 1.1.x版本已停止维护,ubuntu20.04.x系统建议都使用目前长期支持版
下载最新版ssl和sshd

cd /usr/local/src/
tar xf openssl-3.3.1.tar.gz
cd openssl-3.3.1/
./config shared --prefix=/usr/local/openssl --openssldir=/usr/local/openssl

编译安装
make&&make install
运行一段时间等编译安装完成,完成后执行echo \$?显示是否执行成功。

备份原来的openssl
mv /usr/bin/openssl /usr/bin/openssl.bak
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
将openssl 的lib 库添加到系统(‘/usr/local/openssl/lib64’ 单引号)
#openssl 1.x.x版本是: /usr/local/openssl/lib/ 路径
#echo '/usr/local/openssl/lib' > /etc/ld.so.conf.d/openssl.conf
echo '/usr/local/openssl/lib64' > /etc/ld.so.conf.d/openssl.conf
然后加载lib库
ldconfig -v
检查openssl版本

4.下载OpenSSH包
访问链接:https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/通过wget下载OpenSSH_9.9p1
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.9p1.tar.gz
备份文件
mkdir /usr/bin/bak
cp -arpf /usr/bin/scp /usr/bin/bak/scp.bak
cp -arpf /usr/bin/sftp /usr/bin/bak/sftp.bak
cp -arpf /usr/bin/ssh /usr/bin/bak/ssh.bak
cp -arpf /usr/bin/ssh-add /usr/bin/bak/ssh-add.bak
cp -arpf /usr/bin/ssh-agent /usr/bin/bak/ssh-agent.bak
cp -arpf /usr/bin/ssh-keygen /usr/bin/bak/ssh-keygen.bak
cp -arpf /usr/bin/ssh-keyscan /usr/bin/bak/ssh-keyscan.bak
mkdir /usr/sbin/bak
cp -arpf /usr/sbin/sshd /usr/sbin/bak/sshd.bak
进入openssh-9.9p1目录,执行编译安装命令
cd /usr/local/src/
tar -zxf openssh-9.9p1.tar.gz
cd /usr/local/src/openssh-9.9p1
./configure --prefix=/usr/local/openssh-9.9p1 --sysconfdir=/etc/ssh --with-kerberos5 --with-libedit --with-pam --with-gssapi --with-zlib --with-ssl-dir=/usr/local/openssl --with-privsep-path=/var/lib/sshd
make && make install
替换新版openssh命令
cp -arpf /usr/local/openssh-9.9p1/bin/* /usr/bin/
cp -arpf /usr/local/openssh-9.9p1/sbin/* /usr/sbin/
修改配置文件
sed -i 's@#PermitRootLogin prohibit-password@PermitRootLogin yes@g' /etc/ssh/sshd_config
允许root远程登录,并重启ssh
systemctl daemon-reload
systemctl restart ssh
ssh -V 查看版本
注:遇到如下编译问题
解决方法:
安装依赖包
apt install gcc make zlib1g-dev libpam0g-dev libkrb5-dev libedit-dev -y
5,脚本一键升级
#!/bin/bash
# 自动升级 OpenSSL 和 OpenSSH 脚本
# 适用于 Ubuntu 20.04/22.04
# 基于实际操作流程编写
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 版本配置
OPENSSL_VERSION="3.3.1"
OPENSSH_VERSION="9.9p1"
OPENSSL_URL="https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz"
OPENSSH_URL="https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${OPENSSH_VERSION}.tar.gz"
# 工作目录
WORK_DIR="/usr/local/src"
# 检查是否为 root 用户
check_root() {
if [ "$(id -u)" -ne 0 ]; then
echo -e "${RED}错误:请使用 root 用户运行此脚本!${NC}"
exit 1
fi
}
# 检查上一步命令是否成功
check_result() {
if [ $? -eq 0 ]; then
echo -e "${GREEN}✓ 成功${NC}"
else
echo -e "${RED}✗ 失败${NC}"
exit 1
fi
}
# 安装编译依赖包
install_dependencies() {
echo -e "${YELLOW}[1/8] 安装编译依赖包...${NC}"
apt update
apt install -y gcc make zlib1g-dev libpam0g-dev libkrb5-dev libedit-dev wget
check_result
echo -e "${GREEN}依赖包安装完成${NC}\n"
}
# 升级 OpenSSL
upgrade_openssl() {
echo -e "${YELLOW}[2/8] 开始升级 OpenSSL...${NC}"
cd "$WORK_DIR"
# 下载 OpenSSL
if [ ! -f "openssl-${OPENSSL_VERSION}.tar.gz" ]; then
echo -e "${BLUE}下载 OpenSSL ${OPENSSL_VERSION}...${NC}"
wget "$OPENSSL_URL"
check_result
else
echo -e "${GREEN}OpenSSL 安装包已存在,跳过下载${NC}"
fi
# 解压
echo -e "${BLUE}解压 OpenSSL...${NC}"
rm -rf "openssl-${OPENSSL_VERSION}"
tar xf "openssl-${OPENSSL_VERSION}.tar.gz"
check_result
# 进入目录
cd "openssl-${OPENSSL_VERSION}"
# 配置
echo -e "${BLUE}配置 OpenSSL 编译选项...${NC}"
./config shared --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
check_result
# 编译安装
echo -e "${BLUE}编译安装 OpenSSL (可能需要几分钟)...${NC}"
make && make install
check_result
# 验证编译是否成功
echo -e "${BLUE}验证编译结果...${NC}"
if [ $? -eq 0 ]; then
echo -e "${GREEN}OpenSSL 编译安装成功${NC}"
else
echo -e "${RED}OpenSSL 编译安装失败${NC}"
exit 1
fi
# 备份原 openssl
echo -e "${BLUE}备份原 OpenSSL...${NC}"
if [ -f "/usr/bin/openssl" ]; then
mv /usr/bin/openssl /usr/bin/openssl.bak
echo -e "${GREEN}已备份到 /usr/bin/openssl.bak${NC}"
fi
# 创建软链接
ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl
check_result
# 根据系统架构确定 lib 路径
if [ -d "/usr/local/openssl/lib64" ]; then
LIB_PATH="/usr/local/openssl/lib64"
else
LIB_PATH="/usr/local/openssl/lib"
fi
# 添加库路径
echo -e "${BLUE}添加 OpenSSL 库路径...${NC}"
echo "$LIB_PATH" > /etc/ld.so.conf.d/openssl.conf
check_result
# 加载库
ldconfig -v > /dev/null 2>&1
check_result
# 验证版本
echo -e "${GREEN}OpenSSL 新版本:${NC}"
openssl version
echo -e "${GREEN}OpenSSL 升级完成${NC}\n"
}
# 升级 OpenSSH
upgrade_openssh() {
echo -e "${YELLOW}[3/8] 开始升级 OpenSSH...${NC}"
cd "$WORK_DIR"
# 下载 OpenSSH
if [ ! -f "openssh-${OPENSSH_VERSION}.tar.gz" ]; then
echo -e "${BLUE}下载 OpenSSH ${OPENSSH_VERSION}...${NC}"
wget "$OPENSSH_URL"
check_result
else
echo -e "${GREEN}OpenSSH 安装包已存在,跳过下载${NC}"
fi
# 解压
echo -e "${BLUE}解压 OpenSSH...${NC}"
rm -rf "openssh-${OPENSSH_VERSION}"
tar -zxf "openssh-${OPENSSH_VERSION}.tar.gz"
check_result
# 进入目录
cd "openssh-${OPENSSH_VERSION}"
# 备份原有命令
echo -e "${BLUE}[4/8] 备份原有 OpenSSH 命令...${NC}"
mkdir -p /usr/bin/bak
mkdir -p /usr/sbin/bak
# 备份 /usr/bin 下的命令
for cmd in scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan; do
if [ -f "/usr/bin/$cmd" ]; then
cp -arpf "/usr/bin/$cmd" "/usr/bin/bak/${cmd}.bak"
echo -e "${GREEN}已备份 /usr/bin/$cmd${NC}"
fi
done
# 备份 sshd
if [ -f "/usr/sbin/sshd" ]; then
cp -arpf /usr/sbin/sshd /usr/sbin/bak/sshd.bak
echo -e "${GREEN}已备份 /usr/sbin/sshd${NC}"
fi
# 备份 ssh 配置目录
if [ -d "/etc/ssh" ]; then
cp -arpf /etc/ssh /etc/ssh.bak
echo -e "${GREEN}已备份 /etc/ssh 到 /etc/ssh.bak${NC}"
fi
check_result
# 创建 privsep 目录
echo -e "${BLUE}创建 privsep 目录...${NC}"
mkdir -p /var/lib/sshd
chmod 700 /var/lib/sshd
# 配置编译选项
echo -e "${BLUE}[5/8] 配置 OpenSSH 编译选项...${NC}"
./configure --prefix=/usr/local/openssh-${OPENSSH_VERSION} \
--sysconfdir=/etc/ssh \
--with-kerberos5 \
--with-libedit \
--with-pam \
--with-gssapi \
--with-zlib \
--with-ssl-dir=/usr/local/openssl \
--with-privsep-path=/var/lib/sshd
check_result
# 编译安装
echo -e "${BLUE}[6/8] 编译安装 OpenSSH (可能需要几分钟)...${NC}"
make && make install
check_result
# 替换新版命令
echo -e "${BLUE}[7/8] 替换新版 OpenSSH 命令...${NC}"
cp -arpf /usr/local/openssh-${OPENSSH_VERSION}/bin/* /usr/bin/
cp -arpf /usr/local/openssh-${OPENSSH_VERSION}/sbin/* /usr/sbin/
check_result
# 修改配置文件
echo -e "${BLUE}配置 SSH 允许 root 登录...${NC}"
sed -i 's@#PermitRootLogin prohibit-password@PermitRootLogin yes@g' /etc/ssh/sshd_config
sed -i 's@#PermitRootLogin yes@PermitRootLogin yes@g' /etc/ssh/sshd_config
sed -i 's@PermitRootLogin prohibit-password@PermitRootLogin yes@g' /etc/ssh/sshd_config
# 重启 SSH 服务
echo -e "${BLUE}[8/8] 重启 SSH 服务...${NC}"
systemctl daemon-reload
systemctl restart ssh
check_result
# 验证版本
echo -e "\n${GREEN}========== 升级结果 ==========${NC}"
echo -e "${GREEN}OpenSSL 版本:${NC}"
openssl version
echo -e "\n${GREEN}OpenSSH 版本:${NC}"
ssh -V
# 检查服务状态
echo -e "\n${BLUE}SSH 服务状态:${NC}"
systemctl status ssh --no-pager -l
echo -e "\n${GREEN}================================${NC}"
echo -e "${GREEN}OpenSSL 和 OpenSSH 升级完成!${NC}"
echo -e "${GREEN}================================${NC}"
# 显示备份位置
echo -e "\n${YELLOW}备份文件位置:${NC}"
echo -e " OpenSSL: /usr/bin/openssl.bak"
echo -e " OpenSSH 命令: /usr/bin/bak/"
echo -e " OpenSSH 服务: /usr/sbin/bak/sshd.bak"
echo -e " SSH 配置: /etc/ssh.bak/"
echo -e "\n${YELLOW}注意事项:${NC}"
echo -e " 1. 请保持当前 SSH 连接不要断开"
echo -e " 2. 建议另开一个终端测试新 SSH 连接"
echo -e " 3. 测试成功后再关闭当前连接"
echo -e " 4. 如需回滚请联系管理员"
}
# 主函数
main() {
echo -e "${GREEN}================================${NC}"
echo -e "${GREEN}OpenSSL + OpenSSH 自动升级脚本${NC}"
echo -e "${GREEN}版本: OpenSSL ${OPENSSL_VERSION} + OpenSSH ${OPENSSH_VERSION}${NC}"
echo -e "${GREEN}适用于: Ubuntu 20.04/22.04${NC}"
echo -e "${GREEN}================================${NC}\n"
# 检查 root
check_root
# 创建工作目录
mkdir -p "$WORK_DIR"
# 显示当前版本
echo -e "${BLUE}当前系统版本:${NC}"
cat /etc/os-release | grep -E "NAME|VERSION" | head -2
echo -e "\n${BLUE}当前 OpenSSL 版本:${NC}"
openssl version 2>/dev/null || echo "未安装"
echo -e "\n${BLUE}当前 OpenSSH 版本:${NC}"
ssh -V 2>&1
echo ""
# 确认升级
read -p "是否继续升级?(y/n): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo -e "${YELLOW}升级已取消${NC}"
exit 0
fi
# 执行升级步骤
install_dependencies
upgrade_openssl
upgrade_openssh
echo -e "\n${GREEN}脚本执行完毕!${NC}"
}
# 执行主函数
main

