深入解析:SSH 密钥从 RSA 到 Ed25519

问题背景

最近帮几个同事排查 git clone 失败的问题,发现了一个有意思的现象。他们的报错信息都类似:

Permission denied (publickey).
fatal: Could not read from remote repository.

一开始以为是网络问题、权限配置错了、生成sshkey时添加了密码,结果检查发现,这些同事的 .ssh 目录下都有密钥文件,但文件名多了两个,而且不是我们熟悉的 id_rsa 和 id_rsa.pub,而是 id_ed25519 和 id_ed25519.pub。

更有意思的是,他们都说自己按照网上教程生成了 SSH 密钥,也把公钥添加到了 GitLab 上。把原来配置到 gitlab 上的公钥删除,将 id_rsa.pub 里的文本拷贝重新添加,还是会提示报错。

这个问题其实挺典型的,反映了一个技术迁移期的常见困扰:工具的默认行为变了,但我们的认知还停留在过去。

为什么会出现 Ed25519

先说结论:这不是 bug,而是一种进步。

SSH 密钥算法的变迁

早些年,当运行 ssh-keygen 命令时,默认生成的是 RSA 算法的密钥对。RSA 是一种非常成熟的非对称加密算法,从 1977 年就开始使用了,安全性经过了时间的检验。

但随着计算能力的提升和密码学研究的发展,RSA 也暴露出一些问题。比如为了保证安全性,RSA 密钥长度需要不断增加,现在通常推荐使用 2048 位甚至 4096 位。密钥越长,生成和验证的时间就越长。

Ed25519 是基于椭圆曲线密码学的一种算法,在 2011 年左右被提出。它的设计目标就是在保证安全性的同时,提供更好的性能。

什么时候开始变化的

OpenSSH 在较新的版本中开始推荐使用 Ed25519。具体来说:

  • OpenSSH 6.5 版本(2014 年)开始支持 Ed25519
  • 一些 Linux 发行版和 macOS 的新版本中,ssh-keygen 的默认行为开始倾向于 Ed25519
  • Git 官方文档和 GitHub 的帮助文档也开始推荐 Ed25519

所以如果你最近重装了系统,或者升级了 Git 和 OpenSSH,很可能就会遇到这个变化。

Ed25519 到底是什么

简单来说,Ed25519 是一种现代的公钥加密算法,专门为数字签名设计。

技术层面的优势

和 RSA 相比,Ed25519 有这些特点:

安全性更高

Ed25519 使用 256 位的密钥长度,但提供的安全强度相当于 RSA 3072 位。这得益于椭圆曲线密码学的数学特性。而且它的设计从一开始就考虑了各种已知的攻击方式,包括侧信道攻击。

性能更好

密钥生成速度快很多。在我的机器上测试,生成一个 Ed25519 密钥几乎是瞬间完成,而生成 RSA 4096 位密钥需要几秒钟。

签名和验证的速度也更快。虽然在日常使用中这个差异不太明显,但在需要频繁进行 SSH 连接的场景下,累积起来还是能感觉到的。

密钥更短

Ed25519 的公钥只有 68 个字符左右,而 RSA 2048 位的公钥有 372 个字符以上。这让复制粘贴变得更方便,出错的概率也更小。

实际使用中的体验

老实说,对于普通用户来说,RSA 和 Ed25519 在日常使用中的差异几乎感觉不到。你不会因为换了 Ed25519 就觉得 git clone 快了多少。

但从技术债务的角度考虑,现在开始用 Ed25519 是个明智的选择。它代表了未来的方向,各大平台的支持也越来越好。

如何解决克隆问题

回到最开始的问题,既然本地生成的是 Ed25519 密钥,那解决方案其实很简单。

第一步:确认你的密钥

先看看你的 .ssh 目录下有什么:

ls -la ~/.ssh/

你可能会看到这些文件:

id_rsa
id_rsa.pub
id_ed25519
id_ed25519.pub

如果同时存在 RSA 和 Ed25519 密钥,那说明你之前生成过 RSA,后来又生成了 Ed25519。

第二步:查看你添加到 Git 平台的是哪个公钥

登录 GitHub、GitLab 或者 Gitee,进入 SSH Keys 的设置页面,看看你之前添加的公钥内容。

RSA 公钥通常以 ssh-rsa AAAA... 开头。
Ed25519 公钥以 ssh-ed25519 AAAA... 开头。

第三步:添加正确的公钥

如果你想用 Ed25519(推荐),那就把新公钥添加到 Git 平台:

cat ~/.ssh/id_ed25519.pub

复制输出的内容,不同的平台配置路径不同:

  • GitHub:Settings → SSH and GPG keys → New SSH key
  • GitLab:Preferences → SSH Keys
  • Gitee:设置 → SSH 公钥

把复制的内容粘贴进去,给这个密钥起个名字(比如"我的工作电脑",默认会生成一个名字),保存。

第四步:测试连接

添加完公钥后,测试一下:

ssh -T git@github.com

如果看到类似"Hi username! You’ve successfully authenticated"的消息,就说明配置成功了。

如果你有多个密钥

有些人可能需要在同一台机器上使用多个 Git 账号,或者需要连接多个不同的 Git 服务器。这时候就需要配置 SSH config 文件。

创建或编辑 ~/.ssh/config 文件:

nano ~/.ssh/config

添加类似这样的配置:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa_work
Host gitlab.com
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/id_ed25519

这样你就可以为不同的 Host 指定不同的密钥。使用时,可以这样克隆:

git clone git@github-work:company/repo.git

拓展知识

如果我想继续用 RSA 呢

虽然不推荐,但如果你确实需要生成 RSA 密钥(比如要连接的服务器太老,不支持 Ed25519),可以这样:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

这里 -t 指定算法类型,-b 指定密钥长度,-C 添加一个注释(通常用邮箱)。

其他的密钥算法

除了 RSA 和 Ed25519,还有其他一些算法:

ECDSA

这也是基于椭圆曲线的算法,在 Ed25519 流行之前比较常用。但现在一般直接推荐 Ed25519,因为它的设计更简洁,安全性审查更充分。

DSA

这是很老的算法了,OpenSSH 7.0 之后已经默认禁用。如果你看到 id_dsa 这样的文件,强烈建议换掉。

密钥的安全管理

生成密钥时,ssh-keygen 会询问你是否设置 passphrase(密码短语)。这是一个额外的保护层:即使有人拿到了你的私钥文件,没有 passphrase 也无法使用。

建议设置 passphrase,但这样每次使用密钥时都需要输入。可以配合 ssh-agent 使用,输入一次密码后,在当前会话中就不用重复输入了:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

在 macOS 上,还可以把密码存到 Keychain 里:

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

密钥权限问题

SSH 对密钥文件的权限要求很严格。私钥文件必须只有所有者可读:

chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

.ssh 目录本身的权限也要正确:

chmod 700 ~/.ssh

如果权限不对,SSH 会拒绝使用这个密钥,这也是一个常见的报错原因。

密钥的备份

私钥是你身份认证的唯一凭证,丢了就麻烦了。建议:

  • 把私钥备份到安全的地方(加密的移动硬盘、密码管理器等)
  • 不要把私钥存到云盘或者发给别人
  • 如果怀疑私钥泄露,立即删除对应的公钥,重新生成新的密钥对

Git 平台的支持情况

主流的 Git 托管平台都已经支持 Ed25519:

  • GitHub:完全支持,推荐使用
  • GitLab:完全支持
  • Gitee:支持
  • Bitbucket:支持
  • 自建的 GitLab/Gitea/Gogs:取决于服务器的 OpenSSH 版本

如果你的公司使用的是很老的自建 Git 服务器,可能需要确认一下是否支持 Ed25519。

什么时候需要重新生成密钥

这些情况下建议重新生成:

  • 私钥可能泄露了
  • 电脑丢失或被盗
  • 离职换工作
  • 很多年没有更新过(虽然密钥理论上可以一直用,但定期更换是个好习惯)
  • 当前使用的是很老的算法(比如 DSA 或者短密钥的 RSA)

总结

从 RSA 到 Ed25519,这是技术进步的必然趋势。虽然在迁移过程中会遇到一些小问题,但长远来看,使用更现代、更安全的算法是值得的。

如果你现在正在配置新的开发环境,建议直接使用 Ed25519。如果你已经在使用 RSA 密钥且运行良好,也不用急着换,等到下次重装系统或者遇到问题时再切换也不迟。

最重要的是理解这个变化的原因和背景,这样遇到问题时就不会慌张,知道该往哪个方向排查。

posted @ 2025-11-29 13:23  yangykaifa  阅读(130)  评论(0)    收藏  举报