ssh-keygen 是一个用于生成、管理和转换 SSH 认证密钥对的命令行工具。

主要功能是:

  1. 生成密钥对: 这是最常用的功能。它会生成一个私钥和一个公钥
    • 私钥 (private key): 应该严格保存在你的本地计算机上,绝不能泄露给任何人。
    • 公钥 (public key): 可以安全地分发到你想要免密登录的服务器上。
  2. 管理密钥: 可以更改密钥的密码短语(passphrase)、查看密钥指纹等。
  3. 转换密钥格式: 在不同的密钥格式之间进行转换。

在 Linux 上, ssh-keygen 是 OpenSSH 软件包的一部分,通常在大多数 Linux 发行版中默认安装。

Windows 10 (版本 1803 及更高版本) 和 Windows 11 已经内置了 OpenSSH 客户端,其中包含了 ssh-keygen

常用命令

生成密钥对

基本生成命令

ssh-keygen

指定密钥类型和位长

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • -t <type>:指定密钥类型。
    • rsa (默认,但建议指定位长)
    • dsa (不推荐)
    • ecdsa
    • ed25519 (推荐,通常更快更安全)
  • -b <bits>:指定密钥的位长。
    • RSA 推荐 2048 或 4096 (4096 更安全)。
    • ECDSA 和 Ed25519 不需要指定位长,它们有固定的曲线参数。
  • -C "<comment>":为密钥添加一个注释,通常是你的邮箱或标识信息,方便区分。

生成 Ed25519 密钥 (默认)

ssh-keygen -t ed25519 -C "your_email@example.com"

指定密钥文件路径

ssh-keygen -f ~/.ssh/my_new_key -t rsa -b 4096 -C "my_custom_key"
  • -f <filename>:指定生成的私钥文件的路径和名称。对应的公钥文件会自动生成为 <filename>.pub

查看密钥指纹

密钥指纹是密钥的一个短小、可读的表示,常用于验证密钥是否正确或在第一次连接服务器时确认服务器的身份。

查看默认密钥指纹

ssh-keygen -l -f ~/.ssh/id_rsa.pub

或者

ssh-keygen -lf ~/.ssh/id_rsa.pub
  • -l:显示密钥的指纹。

更改密钥的密码短语

为已有的私钥添加、更改或删除密码短语:

ssh-keygen -p -f ~/.ssh/id_rsa
  • -p:更改私钥的密码短语。它会提示你输入旧密码短语(如果有的话)和新密码短语。

从私钥中提取公钥

如果你只有私钥文件,但公钥文件丢失了,可以使用此命令重新生成公钥。

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
  • -y:从私钥中提取公钥。
  • >:将输出重定向到文件。

转换密钥格式

例如,将 OpenSSH 格式的密钥转换为 PKCS#8 格式,或者反之。

转换为 PEM 格式 (旧版 OpenSSH 密钥)

ssh-keygen -p -m PEM -f ~/.ssh/id_rsa
  • -m <format>:指定密钥格式。PEM 是一个常见的旧格式。

转换为 PKCS#8 格式 (更现代,常用于其他工具)

ssh-keygen -p -m PKCS8 -f ~/.ssh/id_rsa

密码短语

生成 SSH 密钥时输入的密码,被称为 密码短语 (passphrase)。它有非常重要的安全作用,但人们经常选择直接回车(即不设置密码短语)。

密码短语的作用

密码短语是对你的私钥的额外一层加密保护。

  • 增强安全性: 如果你的私钥文件(例如 id_rsa 或 id_ed25519)被他人获取,没有密码短语的话,他们就可以直接使用你的私钥来登录你所有配置了该公钥的服务器。但如果私钥被密码短语加密过,即使文件被窃取,攻击者也需要知道密码短语才能解密并使用你的私钥。
  • 防止未经授权的使用: 想象一下你的笔记本电脑丢失或被盗。如果你的私钥没有密码短语保护,任何拿到你电脑的人都可以轻易地使用你的 SSH 凭据。有了密码短语,即使私钥文件在电脑上,也需要输入密码才能使用。

为什么一般都让直接回车(不设置密码短语)

尽管密码短语提供了额外的安全层,但许多用户在生成密钥时选择直接回车,这意味着他们创建了一个没有密码短语保护的私钥。这主要是出于便利性的考虑:

  1. 自动化脚本和程序: 在自动化部署、持续集成/持续交付 (CI/CD) 流程或需要脚本自动登录服务器的场景中,如果私钥有密码短语,每次使用时都需要输入密码,这会中断自动化流程。为了方便自动化,通常会使用无密码短语的私钥。
  2. 日常使用便利: 对于个人用户,每次使用 ssh 命令连接服务器时(或使用 git 等工具通过 SSH 访问仓库时),如果私钥有密码短语,系统会提示你输入密码。这在频繁连接时会变得很麻烦。
  3. SSH 代理 (ssh-agent): 虽然有 ssh-agent 可以帮助解决便利性问题,它允许你在会话开始时输入一次密码短语,然后就可以在整个会话中免密使用私钥。但对于不熟悉 ssh-agent 的用户,或者在一些简单的使用场景下,直接不设置密码短语是最直接的“免密”方式。
  4. 安全意识不足: 一些用户可能没有充分理解密码短语的重要性,或者认为他们的私钥文件足够安全,不会被泄露。

加密算法

ssh-keygen 主要用于生成公钥/私钥对,这些密钥对使用的是公钥算法

以下是 ssh-keygen 命令通过 -t (type) 选项可以用来生成的主要公钥算法类型:

  1. RSA (Rivest–Shamir–Adleman)

    • 命令: ssh-keygen -t rsa
    • 特点: 这是最传统、最广泛使用的公钥算法。你可以通过 -b 选项指定密钥的位长,例如 ssh-keygen -t rsa -b 4096 (推荐 2048 或 4096 位)。
    • 文件: 生成 id_rsa (私钥) 和 id_rsa.pub (公钥)。
    • 安全性: 2048 位及以上通常被认为是安全的,但随着计算能力的发展,未来可能需要更长的位长。
  2. DSA (Digital Signature Algorithm)

    • 命令: ssh-keygen -t dsa
    • 特点: 也是一种数字签名算法,但其密钥长度固定为 1024 位。
    • 文件: 生成 id_dsa (私钥) 和 id_dsa.pub (公钥)。
    • 安全性: 不推荐使用。 1024 位的 DSA 密钥被认为安全性不足,且其性能不如现代算法。许多现代 SSH 服务器和客户端默认禁用或不优先选择 DSA 密钥。
  3. ECDSA (Elliptic Curve Digital Signature Algorithm)

    • 命令: ssh-keygen -t ecdsa
    • 特点: 基于椭圆曲线密码学。与 RSA 相比,ECDSA 可以在更短的密钥长度下提供相同的安全强度,因此密钥文件更小,操作更快。
    • 文件: 生成 id_ecdsa (私钥) 和 id_ecdsa.pub (公钥)。
    • 安全性: 推荐使用。默认会选择 NIST 推荐的曲线(如 nistp256),你也可以通过 -b 选项指定曲线的位数(例如 256, 384, 521),但这实际上是选择不同的 NIST 曲线。例如 ssh-keygen -t ecdsa -b 521
  4. Ed25519 (Edwards-curve Digital Signature Algorithm)

    • 命令: ssh-keygen -t ed25519
    • 特点: 这是一种相对较新、高性能、高安全性且易于实现的椭圆曲线算法。它由 Daniel J. Bernstein 设计,通常被认为是目前最佳的 SSH 密钥类型。它不需要指定位长,因为它的参数是固定的。
    • 文件: 生成 id_ed25519 (私钥) 和 id_ed25519.pub (公钥)。
    • 安全性: 强烈推荐使用。 它提供了出色的安全性和性能,并且不容易受到某些侧信道攻击。