Security

SSH 与 RSA 密钥详解:生成、使用和保护您的密钥对

SSH 和 RSA 密钥对实用指南——了解其工作原理、如何在浏览器中生成密钥,以及如何将其用于安全的服务器访问和加密。

7分钟阅读

Security keys concept

公钥密码学是安全互联网通信的基础——SSH 连接、HTTPS、JWT 签名以及加密电子邮件都依赖于它。理解密钥对的工作原理,能让你成为更高效的开发者,也能让你在安全意识上更上一层楼。

核心概念:公钥与私钥

密钥对由两个数学上相互关联的密钥组成:

  • 私钥 — 保存在你的本地机器上,切勿分享。把它看作你的身份凭证。
  • 公钥 — 可自由分享。你可以将其放在服务器上、GitHub 中或 JWT 配置里。

这种数学关系具有单向性:用公钥加密的数据只能用对应的私钥解密。而用私钥签名的数据,可以用公钥进行验证——且不会泄露私钥。

SSH 密钥:无密码服务器访问

SSH(Secure Shell)是远程服务器访问的标准协议。密码认证虽然可用,但存在弱点——密码可能被猜测、钓鱼攻击或泄露。SSH 密钥认证从根本上更为安全:

  1. 客户端使用私钥提供一个加密证明
  2. 服务器根据你安装的公钥验证该证明
  3. 网络中不传输任何密码——因此没有可被截获的内容

配置 SSH 密钥认证:

# 生成密钥对(Ed25519 是现代标准)
ssh-keygen -t ed25519 -C "your-email@example.com"

# 将公钥复制到服务器
ssh-copy-id user@yourserver.com

# 连接服务器——无需输入密码
ssh user@yourserver.com

公钥存放在服务器的 ~/.ssh/authorized_keys 文件中,私钥永远不会离开你的本地机器。

SSH 中的 Ed25519 与 RSA

Ed25519 是目前的推荐选择:

  • 密钥更短(256 位),安全性等同甚至优于 RSA-4096
  • 签名生成和验证速度更快
  • 所有现代 SSH 服务器均支持

RSA 目前仍被广泛使用,尤其是在拥有旧系统的企业环境中:

  • 2048 位是当今可接受的最小密钥长度
  • 4096 位为长期使用的密钥提供额外的安全余量
  • 密钥越大,认证速度会略微变慢

使用我们的 SSH Key Generator 在浏览器中生成 SSH 密钥——支持 Ed25519 和 ECDSA,基于 Web Crypto API 实现,密钥材料不会离开你的浏览器。

RSA 密钥:加密与签名

RSA 密钥的用途不止于 SSH——还用于 TLS 证书、JWT 签名、加密邮件(PGP)以及 API 认证。

RSA 的常见应用场景:

使用 RS256 的 JWT(JSON Web Tokens):

  • 用 RSA 私钥对令牌进行签名
  • 客户端使用公钥进行验证
  • 与 HS256(对称加密)不同,验证方无需获知签名密钥

代码签名:

  • 用私钥对发布的产物进行签名
  • 用户使用你公开的公钥验证签名
  • 证明该产物来自你本人且未被篡改

TLS/SSL 证书:

  • 证书颁发机构用其私钥对你的公钥进行签名
  • 浏览器使用内置的 CA 公钥进行验证

使用我们的 RSA Key Generator 在浏览器中生成 PEM 格式的 RSA 密钥对——支持 2048 位和 4096 位,完全在本地浏览器中运行。

PEM 格式说明

RSA 和 SSH 密钥通常以 PEM(Privacy Enhanced Mail)格式分发:

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7o4qne60...
-----END PRIVATE KEY-----

头部和尾部标识密钥类型,中间部分是经过 base64 编码的密钥数据。不同的头部对应不同的密钥类型:

  • BEGIN RSA PRIVATE KEY — 传统 PKCS#1 格式
  • BEGIN PRIVATE KEY — PKCS#8 格式(现代工具中更为常见)
  • BEGIN PUBLIC KEY — PKCS#8 格式的公钥
  • BEGIN OPENSSH PRIVATE KEY — OpenSSH 自有的 SSH 密钥格式

保护私钥

私钥的安全至关重要:

  1. 切勿提交到 git — 将 *.pemid_rsaid_ed25519 添加到 .gitignore
  2. 使用密码短语 — 对静态存储的密钥进行加密。即使有人获取了密钥文件,没有密码短语也无法使用。
  3. 限制文件权限 — SSH 要求私钥文件执行 chmod 600;若其他用户可读,SSH 将拒绝使用该密钥
  4. 泄露后立即轮换 — 生成新密钥对,并从所有服务器上移除旧公钥
# 为私钥设置正确的文件权限
chmod 600 ~/.ssh/id_ed25519

密钥指纹

指纹是公钥的简短哈希值,用于在不比较完整密钥的情况下验证身份:

ssh-keygen -lf ~/.ssh/id_ed25519.pub
# 输出:256 SHA256:abc123... your-email@example.com (ED25519)

首次连接服务器时,SSH 会显示该服务器的指纹并请你确认。在接受前,请通过独立渠道(如服务器提供商的文档)核实此指纹。

总结

SSH 和 RSA 密钥对提供的认证与加密能力,在本质上比密码更为安全。SSH 推荐使用 Ed25519,签名和加密推荐使用 RSA-4096,私钥务必使用密码短语保护,并在本地生成密钥——切勿让第三方服务为你生成私钥。