ssh keygen 入门:生成你的第一个 SSH 密钥对 – wiki基地


SSH Keygen 入门:生成你的第一个 SSH 密钥对 – 告别密码,拥抱更安全的连接方式

在现代软件开发、系统管理和云计算的日常工作中,安全地远程访问服务器和版本控制系统(如 Git)是不可或缺的一环。传统的密码认证方式虽然直观,但存在诸多安全隐患,例如密码复杂度不足、密码复用、暴力破解攻击等。为了解决这些问题,一种更强大、更便捷、更安全的认证机制应运而生——SSH 密钥对认证。

本文将作为一份详尽的入门指南,带你一步步了解 SSH 密钥对的工作原理,并指导你使用 ssh-keygen 工具生成你的第一个 SSH 密钥对,为你打开通往更安全、高效远程操作的大门。

一、 什么是 SSH?为什么我们需要密钥对?

在我们深入 ssh-keygen 之前,有必要先简单了解一下 SSH 及其认证方式。

SSH(Secure Shell) 是一种网络协议,用于在不安全的网络(如互联网)上安全地运行网络服务。它最常见的应用场景是远程登录到计算机系统(替代 Telnet)和执行远程命令,但它也可以用于传输文件(使用 SFTP 或 SCP)或为其他网络协议创建安全隧道。SSH 通过强大的加密技术确保了客户端和服务器之间通信的机密性、完整性和真实性。

传统的密码认证 就像是使用一把常见的钥匙(你的密码)去打开一扇门(服务器)。任何人如果知道了这把钥匙(猜到、窃取或破解了你的密码),就能进入。这种方式的问题在于:
1. 密码强度难以保证:用户倾向于设置简单易记的密码,容易被猜到或通过字典攻击破解。
2. 密码泄露风险:如果用户在多个服务中使用相同的密码,一个服务的泄露可能导致所有关联账户的风险。
3. 传输风险:虽然 SSH 会加密传输过程,但密码本身如果不够强壮,仍可能在其他环节(如存储不当)泄露。
4. 暴力破解:攻击者可以不断尝试不同的密码组合来试图登录。

SSH 密钥对认证 则提供了一种基于非对称加密的认证方法,它更像是为你家的门定制了一把独一无二、无法复制的“数字钥匙”。这种方式包含两个关键部分:

  1. 私钥(Private Key):这是你的秘密钥匙,必须妥善保管,绝不能泄露给任何人。它存储在你的本地计算机上。当你尝试连接到服务器时,你的计算机会使用私钥来“签名”一个请求,证明你确实是私钥的所有者。
  2. 公钥(Public Key):这是与私钥配对的“锁芯”,可以安全地分发给任何你需要访问的服务器或服务(如 GitHub、GitLab、云服务器等)。服务器会将你的公钥存储在一个特定的文件(通常是 ~/.ssh/authorized_keys)中。当收到你的连接请求时,服务器会使用存储的公钥来验证你发来的“签名”是否由对应的私钥生成。

为什么 SSH 密钥对更安全?

  • 极高的复杂度:SSH 密钥通常非常长(例如 RSA 2048 位或 4096 位,或者更现代的 Ed25519),其复杂性远超人类能够记忆或轻易猜到的密码。暴力破解几乎是不可能的。
  • 无需传输敏感信息:在认证过程中,私钥本身永远不会离开你的本地计算机,也永远不会通过网络传输。传输的只是用私钥加密或签名的数据,以及公开的公钥。
  • 防止密码泄露:即使服务器端的公钥被盗,攻击者没有对应的私钥也无法冒充你。
  • 自动化和便利性:一旦设置好,SSH 客户端通常可以自动找到并使用你的私钥进行认证,无需每次都输入密码(除非你为私钥设置了额外的密码保护层,即“密码短语”)。

现在,我们知道了为什么需要 SSH 密钥对,接下来就让我们认识一下生成它们的工具:ssh-keygen

二、 认识 ssh-keygen:你的密钥生成器

ssh-keygen 是 OpenSSH 套件中包含的一个标准命令行工具,几乎在所有的 Linux 发行版、macOS 系统以及 Windows(通过 Git Bash、WSL 或 OpenSSH for Windows)中都可以找到。它的核心功能就是生成、管理和转换 SSH 认证密钥。

ssh-keygen 可以生成不同类型的密钥,最常见的包括:

  • RSA (Rivest–Shamir–Adleman):这是最传统、兼容性最广的密钥类型。推荐使用至少 2048 位,最好是 4096 位的长度以保证安全性。
  • DSA (Digital Signature Algorithm):曾经是 SSH-2 协议的标准之一,但现在已被认为不够安全,不再推荐使用。
  • ECDSA (Elliptic Curve Digital Signature Algorithm):基于椭圆曲线加密,提供与 RSA 相当的安全性,但密钥长度更短,计算效率可能更高。
  • Ed25519 (Edwards-curve Digital Signature Algorithm):一种更现代的椭圆曲线算法,性能优异且安全性强,被认为是目前较好的选择,前提是客户端和服务器都支持它(现代系统通常都支持)。

对于初学者,如果没有特殊要求,使用 ssh-keygen 的默认设置(通常是 RSA)或明确指定生成 Ed25519 密钥都是不错的选择。

三、 实战:生成你的第一个 SSH 密钥对

激动人心的时刻到了!让我们一步步生成你的第一个 SSH 密钥对。

准备工作:

你需要一个可以访问命令行的环境:
* Linux / macOS: 打开你的终端(Terminal)应用程序。
* Windows:
* 如果你安装了 Git for Windows,可以使用 Git Bash
* 如果你启用了 Windows Subsystem for Linux (WSL),可以在 WSL 环境的终端中执行。
* 如果你安装了 OpenSSH for Windows,可以使用命令提示符(cmd)或 PowerShell。

步骤 1:运行 ssh-keygen 命令

在你的终端中,输入以下基本命令并按 Enter:

bash
ssh-keygen

这个命令会启动交互式密钥生成过程。

步骤 2:选择密钥存储位置和文件名

运行命令后,你会看到第一个提示:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/your_username/.ssh/id_rsa):

(或者在 Windows 上可能是 /c/Users/your_username/.ssh/id_rsa)

这里询问你想将生成的密钥对保存在哪个文件。括号里显示的是默认路径和默认文件名:
* 路径~/.ssh/~ 代表你的用户主目录)。这是一个隐藏目录(以 . 开头),专门用于存放 SSH 相关配置和密钥。如果这个目录不存在,ssh-keygen 通常会自动创建它。
* 文件名:默认情况下,私钥会被命名为 id_rsa(如果是 RSA 密钥)、id_ed25519(如果是 Ed25519 密钥)等,对应的公钥文件名则是在私钥文件名后加上 .pub 后缀(例如 id_rsa.pub)。

对于你的第一个密钥对,强烈建议直接按 Enter 接受默认设置。 这将确保 SSH 客户端能够自动找到并使用这个密钥。如果你需要管理多个密钥对(例如,用于不同的服务器或项目),你可以在这里指定一个不同的路径或文件名,例如 ~/.ssh/my_work_key。但对于入门,请坚持使用默认值。

步骤 3:设置密码短语(Passphrase) – 强烈推荐!

接下来,你会看到这个提示:

Enter passphrase (empty for no passphrase):

这里要求你输入一个“密码短语”(Passphrase)。这不是你的登录密码! 这是一个额外的安全层,用于加密你的私钥文件本身。

  • 为什么要设置密码短语? 想象一下,如果有人物理访问了你的电脑或者你的私钥文件被恶意软件窃取,没有密码短语保护的私钥就相当于直接把“万能钥匙”交给了对方。但如果你的私钥文件被密码短语加密了,即使文件被盗,攻击者没有这个密码短语也无法使用它。
  • 设置还是不设置?
    • 强烈推荐设置! 这极大地增强了安全性。选择一个强壮但你能记住的密码短语(可以包含空格,更像一个短语)。
    • 不设置(直接按 Enter):密钥仍然可用,连接时无需输入任何额外密码。这在完全受信任的环境或自动化脚本中可能更方便,但安全性较低。如果你丢失了未受保护的私钥,后果会很严重。

输入你选择的密码短语。注意,输入时屏幕上不会显示任何字符(包括星号),这是正常的安全措施。按 Enter。

之后,系统会要求你再次输入相同的密码短语以确认:

Enter same passphrase again:

再次输入并按 Enter。

步骤 4:密钥生成成功!

如果一切顺利,你会看到类似以下的输出:

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:AbCdEfGhIjKlMnOpQrStUvWxYz1234567890aBcDeFg your_username@your_hostname
The key's randomart image is:
+---[RSA 2048]----+
| . |
| + . |
| + B . |
| . * + . |
| . * S o |
| . = + = . |
| . = * B o . |
| . E . O =.o . |
| o . o.+ ..o |
+----[SHA256]-----+

这段输出告诉你:
* 你的私钥已保存在 ~/.ssh/id_rsa(或其他你指定的文件)。再次强调:这个文件必须保密!
* 你的公钥已保存在 ~/.ssh/id_rsa.pub这个文件是公开的,可以分享。
* 密钥指纹(Fingerprint):这是一个密钥的短标识符(通常是 SHA256 或 MD5 哈希值),用于快速验证密钥的身份,例如在首次连接到一个新服务器时,服务器可能会显示其主机密钥的指纹让你确认。
* Randomart 图像:这是一个视觉化的密钥指纹,对于人类来说,比比较长串的哈希字符更容易快速识别模式,增加了一层额外的(虽然不是绝对可靠的)视觉验证。

恭喜!你已经成功生成了你的第一个 SSH 密钥对!

四、 查看和理解生成的密钥文件

现在,让我们进入 ~/.ssh 目录看看我们创建了什么。

bash
cd ~/.ssh
ls -l

你会看到至少两个新文件(假设你接受了默认文件名 id_rsa):

  • id_rsa:这是你的私钥文件。打开它(例如使用 cat id_rsa 或文本编辑器),你会看到一堆看起来像乱码的文本,以 -----BEGIN RSA PRIVATE KEY----- 开头,以 -----END RSA PRIVATE KEY----- 结尾。永远不要将这个文件的内容或文件本身分享给任何人!
  • id_rsa.pub:这是你的公钥文件。打开它(cat id_rsa.pub),你会看到一行长长的文本,通常以 ssh-rsa(或 ssh-ed25519 等,取决于密钥类型)开头,后面跟着一大串字母数字字符,最后可能有一个注释(通常是 your_username@your_hostname)。这部分内容是需要复制并粘贴到你想要访问的服务器或服务上的。

文件权限的重要性:

SSH 对密钥文件的权限非常敏感,特别是私钥。为了安全,~/.ssh 目录的权限应该是 700(只有所有者可读、可写、可执行),私钥文件(id_rsa)的权限应该是 600(只有所有者可读、可写)。公钥文件(id_rsa.pub)的权限通常是 644(所有者可读写,其他人可读)。

ssh-keygen 通常会自动设置正确的权限。但如果遇到权限问题导致 SSH 连接失败,你可以手动修复:

bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

五、 生成特定类型的密钥(进阶)

虽然基本命令 ssh-keygen 通常够用,但有时你可能想明确指定生成的密钥类型和强度。这可以通过 -t (type) 和 -b (bits) 参数实现。

生成 Ed25519 密钥(推荐):

bash
ssh-keygen -t ed25519 -C "[email protected]"

  • -t ed25519:指定密钥类型为 Ed25519。Ed25519 密钥长度是固定的,所以不需要 -b 参数。
  • -C "[email protected]":添加一个注释(Comment)。这通常用于标识密钥的用途或所有者,例如你的电子邮件地址。这个注释会附加在公钥文件的末尾。这对于管理多个密钥很有帮助。

生成 4096 位的 RSA 密钥:

bash
ssh-keygen -t rsa -b 4096 -C "[email protected]"

  • -t rsa:指定密钥类型为 RSA。
  • -b 4096:指定密钥长度为 4096 位(比默认的 2048 位更安全)。
  • -C "...":同样是添加注释。

当使用 -t 指定类型时,ssh-keygen 会默认使用相应的标准文件名(如 id_ed25519id_ed25519.pub),你仍然可以选择接受默认或在提示时指定不同的文件名。

六、 如何使用你的 SSH 密钥对?

生成密钥只是第一步,关键在于如何使用它。

1. 将公钥部署到服务器/服务:

你需要将你的公钥.pub 文件的内容)添加到你希望通过 SSH 密钥认证访问的目标系统上。

  • 对于远程 Linux/Unix 服务器:

    • 推荐方法:ssh-copy-id
      如果你可以暂时通过密码登录到远程服务器,ssh-copy-id 是最简单、最安全的方式。它会自动将你的公钥(默认是 ~/.ssh/id_rsa.pub 或找到的第一个有效公钥)追加到远程服务器上用户的 ~/.ssh/authorized_keys 文件中,并确保目录和文件的权限正确设置。
      bash
      # 语法:ssh-copy-id [选项] [user@]hostname
      ssh-copy-id your_remote_username@your_server_ip_or_hostname

      它会提示你输入远程用户的密码(仅这一次)。之后,你应该就能无密码(或只需输入私钥的密码短语)登录了。
      如果你想指定复制哪个公钥文件,可以使用 -i 参数:
      bash
      ssh-copy-id -i ~/.ssh/id_ed25519.pub your_remote_username@your_server_ip_or_hostname
    • 手动方法:
      如果 ssh-copy-id 不可用,或者你无法通过密码登录,你需要手动操作:
      a. 在本地计算机上,显示你的公钥内容:
      bash
      cat ~/.ssh/id_rsa.pub

      复制输出的整行内容(从 ssh-rsa 或类似标识符开始,到末尾的注释结束)。
      b. 通过某种方式(例如,通过控制台、其他已建立的连接、或服务器提供商的管理界面)登录到远程服务器。
      c. 在远程服务器上,确保 ~/.ssh 目录存在且权限正确(chmod 700 ~/.ssh)。
      d. 编辑(或创建)~/.ssh/authorized_keys 文件(例如使用 nano ~/.ssh/authorized_keys)。
      e. 将你复制的公钥内容粘贴到这个文件中,每个公钥占一行。
      f. 保存并关闭文件。
      g. 确保 authorized_keys 文件的权限正确:chmod 600 ~/.ssh/authorized_keys
  • 对于 GitHub, GitLab, Bitbucket 等代码托管平台:
    这些平台通常在你的账户设置(Settings)或个人资料(Profile)中有专门的 “SSH Keys” 或 “SSH and GPG keys” 部分。
    a. 在本地计算机上,复制你的公钥内容 (cat ~/.ssh/id_rsa.pub)。
    b. 登录到相应的平台网站。
    c. 导航到 SSH 密钥设置页面。
    d. 点击 “Add SSH key” 或类似的按钮。
    e. 通常会有一个 “Title” 或 “Name” 字段,让你给这个密钥起个名字(例如 “My Laptop” 或 “Work Machine”),以便区分。
    f. 将你复制的公钥内容粘贴到 “Key” 或 “Public Key” 的文本框中。
    g. 保存密钥。

2. 使用 SSH 客户端连接:

一旦你的公钥部署到了目标服务器或服务,下次你使用 SSH 客户端连接时(例如 ssh 命令或 Git 操作),客户端会自动尝试使用你 ~/.ssh/ 目录下的私钥进行认证。

  • 对于默认密钥 (id_rsa, id_ed25519 等):
    通常无需额外配置。当你执行:
    bash
    ssh your_remote_username@your_server_ip_or_hostname

    或者进行 Git 操作:
    bash
    git clone [email protected]:username/repository.git

    SSH 客户端会查找默认的私钥文件。
  • 输入密码短语(如果设置了):
    如果你的私钥文件是用密码短语加密的,SSH 客户端会在第一次尝试使用该私钥时提示你输入密码短语:
    Enter passphrase for key '/home/your_username/.ssh/id_rsa':
    输入正确的密码短语后,认证将继续。为了避免每次连接都输入密码短语,你可以使用 SSH Agent(如 ssh-agent),它可以在你的会话期间缓存解密的私钥。
  • 对于非默认密钥文件:
    如果你使用了非默认的文件名(例如 ~/.ssh/my_work_key),你需要告诉 SSH 客户端使用哪个私钥文件。可以通过 -i 参数指定:
    bash
    ssh -i ~/.ssh/my_work_key your_remote_username@your_server_ip_or_hostname

    对于 Git,你可能需要配置 SSH config 文件 (~/.ssh/config) 来指定特定主机使用哪个密钥。

七、 安全最佳实践

  • 保护好你的私钥! 这是最重要的规则。不要分享它,不要上传到公共仓库,确保其文件权限为 600
  • 务必使用强密码短语! 为你的私钥添加一层额外的保护。
  • 定期更换密钥:虽然 SSH 密钥比密码寿命长得多,但出于安全考虑,特别是在高风险环境中,定期生成新的密钥对并替换旧的也是一种好的做法。
  • 使用 SSH Agent 管理密码短语ssh-agent 可以安全地缓存你的私钥密码短语,这样你只需要在会话开始时输入一次,之后该会话中的所有 SSH 连接都可以自动使用该密钥,兼顾了安全和便利。
  • 限制密钥权限:在服务器的 authorized_keys 文件中,可以为每个公钥添加选项来限制其能力(例如,禁止端口转发、限制只能执行特定命令等)。这超出了入门范围,但值得了解。
  • 为不同的环境/服务使用不同的密钥对:这增加了隔离性。如果一个密钥泄露,不会影响其他服务。

八、 总结

恭喜你,你已经完成了 SSH 密钥对生成的入门之旅!你现在应该理解了:

  • SSH 及其密钥对认证的基本原理。
  • 为什么 SSH 密钥比密码更安全、更方便。
  • 如何使用 ssh-keygen 命令生成你的第一个 SSH 密钥对(包括选择位置、设置密码短语)。
  • 生成的私钥(id_rsa)和公钥(id_rsa.pub)文件的区别和用途。
  • 如何将公钥部署到远程服务器或 Git 服务。
  • SSH 客户端如何自动使用你的密钥进行连接。
  • 一些重要的安全最佳实践。

生成和使用 SSH 密钥对是现代技术工作中一项基础且重要的技能。它不仅能提升你的工作效率(告别频繁输入密码),更能显著增强你访问远程资源时的安全性。现在,就开始在你的日常工作流中应用 SSH 密钥吧,享受它带来的便利与安心!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部