解决macOS升级到Tahoe后ssh-dss算法失效的问题
本篇介绍如何在 macOS Tahoe(M芯片) 终端利用 ssh 继续通过 DSA 算法连接远程服务器,解决因 OpenSSH 升级带来的异常
Bad key types '+ssh-dss'。
概述
macOS 近期推送了新的系统 Tahoe,系统升级的同时也升级了内部的 OpenSSH 组件到OpenSSH_10.0p2版本。根据 OpenSSH 计划表 10.0 版本已全面停止了对 DSA 算法的支持。
因此,在终端尝试使用 DSA 算法进行远程登录将报错:
-> ssh -oHostKeyAlgorithms=+ssh-dss username@host
Bad key types '+ssh-dss'
OpenSSH 从 7.0 版本(2015 年发布)开始默认禁用 DSA(ssh-dss)密钥,并于 10.0 版本(macOS Tahoe正在使用的版本)完全移除支持。主要原因在于 DSA(ssh-dss)算法的固定密钥只有 1024 位,现有算力下已不再安全。
下面将介绍如何借助 brew 安装 OpenSSH_8.9p1 来解决该问题。
快速解决
⚠️ 提醒
- 前提:macOS 系统中已安装 Homebrew,如果没有可以参考 Homebrew 进行安装
- 以下命令执行流程必须顺序执行
- OpenSSH_9.x 版本仍然无法使用 DSA 算法,不要尝试使用该版本解决此问题
📖 Homebrew Tap
原意是水龙头(Tap),可以简单理解成 Homebrew 的软件仓库,Homebrew 允许从第三方的软件仓库下载并安装。
- Homebrew 已不再维护低版本的 OpenSSH,需要在本地引入第三方 Homebrew Tap(该 Tap 全部基于 Homebrew.git 历史提交修改,可放心使用)
brew tap $USER/my-tap https://gitee.com/TonyaBaSy/homebrew-tap.git
- 卸载已安装的 OpenSSH
brew uninstall openssh
- 安装 OpenSSL 1.1(OpenSSH 8.9p1 依赖该版本的 OpenSSL)
# 安装前先禁止 Homebrew 自动更新,用于防止 Homebrew 自行将 OpenSSH 更新到最新版本
export HOMEBREW_NO_AUTO_UPDATE=1
brew install $USER/my-tap/openssl@1.1
- 安装 OpenSSH 8.9p1
brew install $USER/my-tap/openssh
- ssh 命令默认使用 macOS 自带 OpenSSH(10.0版本),需要通过绝对路径引用刚刚安装的 ssh 命令(为避免使用绝对路径可自行添加全局变量至 PATH)。OpenSSH-8.9p1 已默认禁止 DSA,需要添加参数以启用 DSA
Homebrew 安装路径通常在
/opt/homebrew,可以通过brew --prefix命令查看
$HOMEBREW_HOME/Cellar/openssh/bin/ssh -o HostKeyAlgorithms=+ssh-dss username@host
为了保险起见,可以将 $HOMEBREW/Cellar/openssh 拷贝另外的一个目录下,例如 /opt/openssh 避免因误操作 Homebrew 命令导致 OpenSSH 被删除或更新成最新版本。
mkdir -p /opt/openssh
cp /opt/homebrew/Cellar/openssh /opt/openssh
相关说明
由于 Homebrew 已经不再提供 OpenSSL@1.1 版本,因此需要通过第三方仓库下载,本文中使用的 OpenSSL@1.1 Formula 是笔者基于 Homebrew 的 git l历史提交构建,未做任何影响 OpenSSH 使用的篡改。相关源码可以查阅 Git 仓库。
OpenSSL 安装过程中需要基于 OpenSSL 官网下载源码并进行编译,编译需要一定时间(取决于机器性能)。源码从官网下载原版比较慢,笔者修改了 Tap 中的 mirror 配置,优化了下载速度。
另外,OpenSSH-8.9p1 的 Tap Formula 来自 Homebrew Github 仓库历史提交。
关于本篇文档有任何疑问或者问题欢迎评论区交流或发邮件给我。

浙公网安备 33010602011771号