掌握 ssh-keygen:揭秘公钥与私钥的工作原理与生成实践

掌握 ssh-keygen:揭秘公钥与私钥的工作原理与生成实践

在日常的软件开发和系统管理中,我们经常需要安全地连接到远程服务器、执行 Git 操作,或者进行其他需要身份认证的网络通信。传统的密码认证方式往往存在暴力破解和中间人攻击的风险,而基于SSH密钥认证的机制,则提供了一种更强大、更安全的解决方案。

SSH(Secure Shell)密钥对由公钥私钥组成。公钥可以公开,放置在远程服务器上;私钥则必须严格保密,存放在本地。当尝试连接时,SSH客户端会用私钥加密一段数据,服务器用对应的公钥解密验证,从而完成身份认证,无需传输敏感的密码。

本文将深入解析生成SSH密钥对的核心命令:ssh-keygen -t rsa -b 4096 -C "your_email@example.com",并指导你如何在实践中正确使用它。


一、ssh-keygen:SSH密钥生成器

ssh-keygen 是一个用于生成、管理和转换SSH密钥对的实用工具。它是 OpenSSH 套件的一部分,几乎在所有类Unix系统(包括Linux、macOS)以及通过Git Bash等工具在Windows上都可用。

它的基本功能是生成一个公钥*.pub文件)和一个私钥(无后缀文件)。

二、核心命令解析:ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

让我们逐个参数地 dissect 这个命令:

1. ssh-keygen:调用密钥生成程序

这是启动SSH密钥生成过程的命令。

2. -t rsa:指定密钥类型

  • -t--type 的缩写,用于指定要生成的密钥类型。

  • rsa 是一种非对称加密算法,也是目前最常用和最受支持的SSH密钥类型之一。除了 RSA,其他常见的类型包括:

    • dsa (不再推荐使用,安全性较低)
    • ecdsa (椭圆曲线数字签名算法,通常比RSA性能更好,密钥更短,但兼容性可能稍逊于RSA)
    • ed25519 (一种基于爱德华兹曲线的数字签名算法,被认为是目前最安全、性能最佳的选择之一,推荐使用)

    推荐使用 rsa (兼容性好且安全)或 ed25519 (最新且安全)。 对于大多数场景,rsa 足够满足需求。

3. -b 4096:指定密钥长度(位)

  • -b--bits 的缩写,用于指定密钥的位数。位数越多,密钥的强度越高,破解难度越大,但生成和使用(加密/解密)的性能开销也越大。
  • 对于RSA密钥:
    • 默认通常是 2048 位。
    • 推荐使用 4096 位。 2048 位在当前看来仍然安全,但考虑到未来计算能力的发展,4096 位提供了更高的安全边际。更高的位数(如 8192)通常不建议,因为性能开销显著增加而安全性提升不明显。
  • 对于 ecdsaed25519 等密钥类型,密钥长度不是直接由位数决定,而是由曲线类型决定,所以 -b 参数不适用于它们。

4. -C "your_email@example.com":添加注释

  • -C--comment 的缩写,用于为公钥文件添加一个注释。这个注释会出现在公钥文件的末尾。

  • 通常,我们会将电子邮件地址或与密钥用途相关的描述作为注释。这样做的好处是:

    • 识别密钥来源: 当你在GitHub、GitLab等代码托管平台添加多个SSH密钥时,可以方便地识别出哪个密钥属于哪台机器或哪个用途。
    • 管理方便: 在服务器上查看授权密钥文件 (authorized_keys) 时,通过注释可以快速了解各个公钥的用途。

    请务必将 "your_email@example.com" 替换为你自己的邮箱地址或有意义的描述。


三、生成SSH密钥对的完整过程(实践)

现在,让我们一步步来实践生成SSH密钥对:

1. 打开终端

  • Linux/macOS: 打开你的终端应用(如 Terminal, iTerm2)。
  • Windows: 推荐使用 Git Bash。你也可以使用 PowerShell,但请确保 ssh-keygen 命令是可用的。

2. 执行命令

在终端中输入完整命令,并将邮箱替换为你的实际邮箱:

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

3. 提示信息

  • Enter file in which to save the key (~/.ssh/id_rsa):
    这是询问你将密钥保存到哪个文件。默认路径是用户主目录下的 .ssh 隐藏文件夹。id_rsa 是默认的文件名。强烈建议直接按 Enter 接受默认值。 如果你更改了文件名,后续可能需要进行额外的配置才能让SSH客户端找到密钥。

  • Enter passphrase (empty for no passphrase):
    这是要求你为私钥设置一个密码短语 (passphrase)

    • 推荐设置: 设置一个强密码短语可以为你的私钥提供额外的安全保护。即使私钥不幸泄露,没有密码短语也无法使用。
    • 便捷性考虑: 如果不希望每次使用私钥都输入密码短语,可以直接按 Enter 留空。但请注意,这意味着私钥一旦被盗用,攻击者可以直接使用它。
    • 如果你设置了密码短语,会再次提示你输入确认。

4. 生成结果

成功生成后,你将看到类似以下的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Your identification has been saved in /home/your_username/.ssh/id_rsa.
Your public key has been saved in /home/your_username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx your_email@example.com
The key's randomart image is:
+---[RSA 4096]----+
| .oo. |
| . .B + |
| o +* . |
| . *B =. |
| oSE=. |
| . =.= |
| . o + . |
| o . . |
| . |
+----[SHA256]-----+

这表明你的私钥(id_rsa)和公钥(id_rsa.pub)已经成功生成并保存在指定路径下。

四、后续步骤:上传公钥与使用

  1. 复制公钥内容:
    使用 cat 命令查看公钥内容并复制:

    1
    cat ~/.ssh/id_rsa.pub

    复制从 ssh-rsassh-ed25519 开始到注释结束的所有内容。

  2. 添加到远程服务:
    将复制的公钥内容添加到你要连接的远程服务(如 GitHub、GitLab、Gitee、Bitbucket 或你的VPS服务器)的SSH密钥设置中。通常是在“SSH keys”或“Deploy keys”的设置页面。

  3. 使用SSH代理 (可选但推荐,尤其是有密码短语时):
    如果你为私钥设置了密码短语,为了避免每次使用都输入,可以启动SSH代理并将私钥添加到代理中:

    1
    2
    eval "$(ssh-agent -s)" # 启动代理
    ssh-add ~/.ssh/id_rsa # 将私钥添加到代理,需要输入密码短语

    这样,在当前会话中,只要SSH代理运行,就无需再次输入密码短语。

五、总结

ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 命令是生成强大且安全的SSH密钥对的基石。通过合理选择密钥类型和长度,并添加有价值的注释,你可以显著提升SSH通信的安全性、管理性和便捷性。掌握这一命令,将为你的开发和运维工作带来极大的便利和安全保障。

现在,去生成你自己的SSH密钥,开启更安全的连接之旅吧!


掌握 ssh-keygen:揭秘公钥与私钥的工作原理与生成实践

https://lbs.wiki/pages/21aeb92d/

作者

李博帅

发布于

2025-06-06

更新于

2025-06-06

许可协议