手把手教你用 ssh-keygen 生成和配置 SSH 密钥 – wiki基地


手把手教你用 ssh-keygen 生成和配置 SSH 密钥:告别密码,拥抱更安全的远程连接

在现代软件开发和系统管理中,通过 SSH(Secure Shell)协议安全地远程连接到服务器、代码仓库(如 GitHub、GitLab)或其他计算资源是一项基本技能。传统的密码认证方式虽然直观,但面临着暴力破解、密码泄露等诸多安全风险。相比之下,使用 SSH 密钥对进行认证,不仅极大提高了安全性,还能简化登录流程,甚至实现自动化操作。

本文将作为一份详尽的指南,手把手带你深入了解 SSH 密钥的工作原理,并详细演示如何使用 ssh-keygen 工具生成、配置和管理你的 SSH 密钥对,最终实现无密码安全登录。无论你是开发者、运维工程师,还是对网络安全感兴趣的技术爱好者,都能从中受益。

文章目标读者:

  • 需要远程连接 Linux/Unix 服务器的用户。
  • 使用 Git 进行版本控制,并需要与远程仓库(GitHub, GitLab, Bitbucket 等)交互的开发者。
  • 希望提高远程连接安全性的系统管理员。
  • 对 SSH 密钥认证机制感兴趣的技术人员。

本文主要内容:

  1. SSH 密钥认证基础: 简述 SSH 协议及密钥认证原理。
  2. 为什么选择 SSH 密钥: 对比密码认证的优势。
  3. 准备工作: 检查 ssh-keygen 工具。
  4. 核心步骤:生成 SSH 密钥对
    • 运行 ssh-keygen 命令。
    • 理解交互式提示:文件路径、密码短语(Passphrase)。
    • 密钥类型和长度的选择(RSA, Ed25519 等)。
  5. 理解生成的密钥文件: 私钥与公钥的区别与作用。
  6. 配置 SSH 客户端(本地):
    • SSH Agent 的使用:管理密钥和密码短语。
    • ssh-add 命令:将密钥添加到 Agent。
    • ~/.ssh/config 文件:简化多服务器连接管理。
  7. 部署公钥到远程服务器:
    • 方法一:使用 ssh-copy-id (推荐)。
    • 方法二:手动复制公钥内容。
    • 理解 ~/.ssh/authorized_keys 文件和权限设置。
  8. 测试连接: 验证无密码登录是否成功。
  9. 管理多个 SSH 密钥: 为不同服务或身份使用不同密钥。
  10. 安全最佳实践与注意事项: 保护私钥、使用强密码短语、定期更换密钥等。
  11. 常见问题与故障排查。

1. SSH 密钥认证基础

在我们开始生成密钥之前,有必要简单了解一下背景知识。

  • SSH (Secure Shell): 是一种网络协议,用于在不安全的网络上提供安全的远程登录、文件传输和其他网络服务。它通过加密通信内容来防止窃听和数据篡改。
  • 密钥认证 (Public Key Authentication): 这是 SSH 提供的一种比密码认证更安全的认证方式。它基于非对称加密技术,涉及一对密钥:
    • 私钥 (Private Key): 存放在你的本地计算机上,绝对不能泄露给任何人。它相当于你的数字身份证明,能解密用对应公钥加密的信息。
    • 公钥 (Public Key): 可以安全地分享给任何你需要连接的远程系统(如服务器、代码仓库)。它用于加密信息,只有对应的私钥才能解密。

认证流程简述:

当你尝试使用密钥连接到配置了你公钥的远程服务器时:

  1. 你的 SSH 客户端向服务器表明身份,并告知希望使用哪个密钥进行认证。
  2. 服务器找到你预先存放在那里的公钥,生成一个随机的挑战信息(Challenge),并用你的公钥加密这个信息,然后发送回你的客户端。
  3. 你的 SSH 客户端收到加密信息后,尝试使用你的私钥进行解密。
  4. 如果解密成功(意味着你的确拥有与服务器上公钥配对的私钥),客户端将解密后的原始挑战信息发回给服务器。
  5. 服务器对比发回的信息与原始挑战信息,如果一致,就确认了你的身份,允许连接,全程无需传输密码。

2. 为什么选择 SSH 密钥?

相比传统的密码登录,SSH 密钥认证具有显著优势:

  • 极高的安全性:
    • 抗暴力破解: SSH 密钥通常非常长(如 RSA 2048位 或 4096位,Ed25519 更为紧凑但强度相当),几乎不可能通过暴力猜测来破解私钥。而密码则常常因为长度不足、复杂度不够或被复用而容易被破解。
    • 防止密码泄露: 认证过程中,你的私钥永远不会离开你的本地计算机,不会在网络上传输,避免了密码在传输过程中被截获的风险。
  • 便捷性:
    • 无密码登录: 一旦配置完成,你可以直接连接到远程服务器,无需每次都输入密码(如果为私钥设置了密码短语,则可能需要输入一次密码短语,但可以通过 SSH Agent 优化)。
    • 自动化友好: 对于需要脚本自动执行的远程任务(如部署、备份),SSH 密钥是实现无人值守操作的关键。
  • 集中管理: 你可以用一对密钥管理多个服务器的访问权限,只需将公钥部署到所有目标服务器即可。

3. 准备工作:检查 ssh-keygen 工具

ssh-keygen 是 OpenSSH 套件中的一个标准工具,用于生成、管理和转换 SSH 密钥。在大多数现代操作系统中,它通常已经预装好了。

  • Linux & macOS: 打开你的终端(Terminal)。
  • Windows:
    • Git Bash: 如果你安装了 Git for Windows,它自带了一个 Bash 环境,其中包含了 ssh-keygen
    • Windows Subsystem for Linux (WSL): 如果你安装了 WSL,可以在其 Linux 环境中使用 ssh-keygen
    • OpenSSH Client (Windows 10/11): 较新版本的 Windows 10/11 可以通过“可选功能”安装 OpenSSH 客户端,之后可以在命令提示符 (cmd) 或 PowerShell 中使用 ssh-keygen

在你的终端或命令行界面中,输入以下命令并按回车键,检查工具是否存在:

bash
ssh-keygen --version

如果看到类似 OpenSSH_8.9p1 Ubuntu-3ubuntu0.1, OpenSSL 3.0.2 15 Mar 2022 的输出,说明 ssh-keygen 已经可用。如果提示命令未找到,请根据你的操作系统安装 OpenSSH 客户端或 Git Bash/WSL。


4. 核心步骤:生成 SSH 密钥对

现在,让我们开始生成你的第一对 SSH 密钥。打开你的终端或命令行工具。

4.1 运行基本命令

最简单的生成命令是:

bash
ssh-keygen

执行后,它会开始一个交互式的过程,询问你几个问题。

4.2 理解交互式提示

  • 提示 1: “Enter file in which to save the key (/home/your_user/.ssh/id_rsa):”

    • 含义: 询问你希望将生成的密钥文件保存在哪里,以及使用什么名称。
    • 默认路径: ~/.ssh/id_rsa (在 Linux/macOS/Git Bash 中,~ 代表你的用户主目录;在 Windows 原生 OpenSSH 中可能是 C:\Users\YourUser\.ssh\id_rsa)。.ssh 目录是存放 SSH 相关配置和密钥的标准位置。id_rsa 是默认的私钥文件名,对应的公钥会自动命名为 id_rsa.pub
    • 建议: 如果你没有特殊需求(比如为不同服务创建不同密钥),直接按回车键接受默认设置即可。如果 .ssh 目录不存在,ssh-keygen 会自动创建它。如果你需要创建特定用途的密钥,可以指定一个不同的路径和名称,例如 ~/.ssh/github_key
  • 提示 2: “Enter passphrase (empty for no passphrase):”

    • 含义: 要求你为即将生成的 私钥 设置一个密码短语(Passphrase)。这个密码短语用于加密你的私钥文件本身。
    • 重要性: 强烈建议设置一个强密码短语! 这相当于给你的私钥上了一道额外的保险。即使有人设法获取了你的私钥文件,没有密码短语也无法使用它。密码短语应该足够长且复杂,不易被猜到,但又方便你记忆。
    • 不设置密码短语(留空直接回车): 如果你将密码短语留空,那么任何人只要能访问到你的私钥文件,就能直接使用它进行认证。这在某些自动化场景下可能需要,但会显著降低安全性。请仅在完全理解风险并有其他安全措施(如严格的文件权限控制)的情况下才这样做。
    • 输入: 输入你选择的密码短语。输入时屏幕上不会显示任何字符(包括星号),这是正常的安全措施。按回车。
  • 提示 3: “Enter same passphrase again:”

    • 含义: 再次输入相同的密码短语以确认。
    • 输入: 再次准确输入你刚才设置的密码短语,然后按回车。

4.3 生成完成

如果两次输入的密码短语一致,ssh-keygen 就会完成密钥对的生成,并显示类似以下的输出:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/your_user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/your_user/.ssh/id_rsa.
Your public key has been saved in /home/your_user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:aBcDeFgHiJkLmNoPqRsTuVwXyZaBcDeFgHiJkLmNo your_user@your_hostname
The key's randomart image is:
+---[RSA 3072]----+
| . .. |
| . + . |
| . * o |
| . = * . |
| . + S = |
| . . + B . |
| o . * = . |
| . . O.= E . |
| ..+*+o=o+ |
+----[SHA256]-----+

这表示:

  • 你的 私钥 已保存在 /home/your_user/.ssh/id_rsa (或你指定的路径)。
  • 你的 公钥 已保存在 /home/your_user/.ssh/id_rsa.pub (或对应路径)。
  • 同时还显示了密钥的指纹(Fingerprint)和随机艺术图像(Randomart),它们是密钥的简短、易于(相对)视觉比较的表示形式,有时用于验证密钥。

4.4 密钥类型和长度的选择 (进阶)

默认情况下,ssh-keygen 可能会生成 RSA 类型的密钥(具体取决于你的 OpenSSH 版本)。你可以通过 -t 参数指定密钥类型,通过 -b 参数指定 RSA/DSA 密钥的位数。

  • RSA: 最广泛兼容的类型。推荐使用至少 3072 位或 4096 位。
    bash
    ssh-keygen -t rsa -b 4096
  • Ed25519: 一种更新、更高效、通常认为更安全的椭圆曲线算法。它生成的密钥更短,性能更好,是目前推荐的选择,只要你的客户端和服务端都支持(现代系统基本都支持)。
    bash
    ssh-keygen -t ed25519

    Ed25519 密钥长度是固定的,无需指定 -b。如果使用 Ed25519,默认文件名可能是 id_ed25519id_ed25519.pub
  • ECDSA: 另一种椭圆曲线算法。
    bash
    ssh-keygen -t ecdsa -b 521 # 指定曲线大小,如 256, 384, 521

  • 添加注释 (-C): 你可以使用 -C 参数为密钥添加注释,通常是你的邮箱地址或身份标识,这有助于在服务器上管理多个公钥时区分来源。
    bash
    ssh-keygen -t ed25519 -C "[email protected]"

    这个注释会附加在公钥文件的末尾。


5. 理解生成的密钥文件

现在,你的 ~/.ssh 目录下(或你指定的目录)应该有两个新文件:

  • 私钥文件 (例如 id_rsaid_ed25519):

    • 这是你的 秘密永远不要分享这个文件! 它的保密性是整个安全机制的基础。
    • 它的内容通常以 -----BEGIN OPENSSH PRIVATE KEY----- (或类似的,如 BEGIN RSA PRIVATE KEY) 开头,以 -----END OPENSSH PRIVATE KEY----- 结尾。
    • 权限: ssh-keygen 通常会自动设置严格的文件权限,确保只有你自己能读取这个文件 (权限应为 600,即 -rw-------)。你可以用 ls -l ~/.ssh 检查。如果权限不正确,SSH 客户端可能会拒绝使用它。你可以手动设置权限:chmod 600 ~/.ssh/id_rsa
  • 公钥文件 (例如 id_rsa.pubid_ed25519.pub):

    • 这是你可以 安全地分享 的部分。你需要把它复制到你想要无密码登录的远程服务器或添加到代码仓库(如 GitHub)的设置中。
    • 它的内容通常是一长串由空格分隔的文本,格式大致为:[密钥类型] [Base64编码的密钥内容] [注释]。例如:
      ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGf+kL7nKbV1E2yG5bVzPqQoNz5wzL9Q5rX9f8j3K0nF [email protected]
    • 你可以使用 cat ~/.ssh/id_rsa.pub (或对应的公钥文件名) 查看其内容,以便复制。

6. 配置 SSH 客户端(本地)

为了更方便地使用 SSH 密钥,特别是带密码短语的密钥,我们可以利用 SSH Agent。

6.1 SSH Agent 介绍

SSH Agent 是一个后台程序,它可以缓存你的解密后的私钥。当你第一次使用需要密码短语的私钥时,Agent 会要求你输入密码短语,然后将解密后的密钥加载到内存中。在 Agent 运行期间,后续需要使用该密钥的 SSH 连接将自动从 Agent 获取密钥,无需再次输入密码短语。

6.2 启动 SSH Agent

在大多数现代 Linux 桌面环境和 macOS 中,SSH Agent 通常会自动启动。如果需要手动启动(或在某些终端会话中),可以使用:

bash
eval "$(ssh-agent -s)"

这个命令会启动 Agent 进程,并设置必要的环境变量,使其能被当前的 shell 会话识别。你会看到类似 Agent pid 12345 的输出。

6.3 将密钥添加到 SSH Agent (ssh-add)

启动 Agent 后,需要将你的私钥添加到 Agent 的管理中:

  • 添加默认密钥 (~/.ssh/id_rsa~/.ssh/id_ed25519):
    bash
    ssh-add
  • 添加指定路径的密钥:
    bash
    ssh-add ~/.ssh/your_specific_key

执行 ssh-add 时:

  • 如果你的私钥 没有 密码短语,它会直接添加成功,并显示 Identity added: ...
  • 如果你的私钥 密码短语,它会提示你输入:Enter passphrase for /home/your_user/.ssh/id_rsa:。输入正确的密码短语后,密钥会被解密并添加到 Agent,同样显示 Identity added: ...

注意:

  • SSH Agent 的生命周期通常与你的登录会话或终端窗口相关。关闭终端或注销后,Agent 可能会停止,你需要重新启动并 ssh-add 密钥。某些系统(如 macOS 的 Keychain 集成)可以实现更持久的缓存。
  • 你可以使用 ssh-add -l 查看 Agent 当前管理的密钥列表,使用 ssh-add -D 删除 Agent 中的所有密钥。

6.4 使用 ~/.ssh/config 文件简化连接 (推荐)

当你需要管理多个服务器或使用非默认密钥时,~/.ssh/config 文件非常有用。这是一个纯文本文件,允许你为不同的主机设置别名和连接参数。

创建或编辑 ~/.ssh/config 文件 (如果不存在,可以手动创建):

“`bash
nano ~/.ssh/config

或者使用你喜欢的文本编辑器,如 vim, gedit, code 等

“`

在文件中,你可以为每个目标主机定义一个 Host 条目。例如:

“`

~/.ssh/config

默认设置 (可以不写,或者写在这里影响所有未特殊指定的主机)

Host *

User your_default_unix_user

连接到我的工作服务器

Host work-server
HostName server.example.com # 实际的服务器地址或 IP
User adminuser # 登录用户名
Port 2222 # 如果 SSH 端口不是默认的 22
IdentityFile ~/.ssh/id_rsa_work # 指定用于此连接的私钥文件

连接到 GitHub

Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github_key # 使用专门为 GitHub 生成的密钥

连接到个人 VPS

Host my-vps
HostName 192.168.1.100
User myuser
IdentityFile ~/.ssh/id_ed25519 # 使用 Ed25519 密钥
# 可以添加其他选项,如启用 TCPKeepAlive 等
# ServerAliveInterval 60

“`

常用指令说明:

  • Host: 定义一个别名(如 work-server)。之后你可以直接用 ssh work-server 连接。
  • HostName: 远程主机的实际 IP 地址或域名。
  • User: 登录远程主机时使用的用户名。
  • Port: SSH 服务监听的端口(默认是 22)。
  • IdentityFile: 指定连接该主机时应使用的 私钥 文件路径。这对于管理多个密钥对至关重要。

配置好 ~/.ssh/config 文件后,连接将变得非常简单:

bash
ssh work-server # 会自动使用 server.example.com, adminuser, 端口 2222, 和 id_rsa_work 密钥
ssh my-vps # 会自动使用 192.168.1.100, myuser, 和 id_ed25519 密钥
git clone [email protected]:username/repo.git # 如果配置了 github.com 的 IdentityFile,会自动使用 github_key

重要: 确保 ~/.ssh/config 文件的权限也是安全的,通常设置为 600 (chmod 600 ~/.ssh/config),虽然 SSH 客户端对它的权限要求没有私钥那么严格,但保持良好习惯是必要的。


7. 部署公钥到远程服务器

生成了密钥对,本地也配置好了,现在需要将你的 公钥 告知你想要连接的远程服务器。目标是将你本地 ~/.ssh/id_rsa.pub (或 id_ed25519.pub 等) 的内容,追加到 远程服务器 上目标用户家目录下的 ~/.ssh/authorized_keys 文件中。

7.1 方法一:使用 ssh-copy-id (推荐)

这是最简单、最不容易出错的方法。ssh-copy-id 是一个专门为此设计的脚本工具,它会自动处理目录创建、文件追加和权限设置。

前提: 你需要能够通过密码或其他现有方式(可能是另一个已配置好的密钥)至少登录一次远程服务器。

命令格式:

bash
ssh-copy-id [options] user@remote_host

  • user: 你在远程服务器上的用户名。
  • remote_host: 远程服务器的 IP 地址或域名。

示例: 将默认公钥 (~/.ssh/id_rsa.pub) 复制到 server.example.comadminuser 用户下:

bash
ssh-copy-id [email protected]

如果你想指定复制哪个公钥(例如,你用 -f 生成了非默认名称的密钥,或者想部署 Ed25519 密钥),使用 -i 参数:

bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]

执行过程:

  1. ssh-copy-id 会尝试连接到 user@remote_host
  2. 它会提示你输入 userremote_host 上的 密码 (这是最后一次需要密码登录)。
  3. 验证密码后,它会检查远程服务器上是否存在 ~/.ssh 目录,如果不存在则创建,并设置权限为 700 (drwx------)。
  4. 然后,它会将你本地指定的公钥内容追加到远程服务器的 ~/.ssh/authorized_keys 文件中。
  5. 它还会确保 authorized_keys 文件的权限为 600 (-rw-------)。
  6. 完成后,它会提示你现在可以尝试用密钥登录了:Try logging into the machine...

7.2 方法二:手动复制公钥内容

如果你的本地系统没有 ssh-copy-id 工具(比较少见),或者由于某种原因无法使用它,可以手动完成公钥部署。

步骤:

  1. 在本地获取公钥内容:
    bash
    cat ~/.ssh/id_rsa.pub
    # 或者 cat ~/.ssh/id_ed25519.pub

    复制终端输出的那一长串 ssh-rsa ...ssh-ed25519 ... 的完整内容。确保完全复制,没有遗漏或多余的换行。

  2. 通过密码登录到远程服务器:
    bash
    ssh user@remote_host

    输入你的密码。

  3. 在远程服务器上操作:

    • 确保 ~/.ssh 目录存在并具有正确权限:
      bash
      mkdir -p ~/.ssh # -p 选项表示如果目录已存在则不报错
      chmod 700 ~/.ssh # 权限必须是 700 (只有所有者可读写执行)
    • 将公钥内容追加到 authorized_keys 文件:
      bash
      echo "粘贴你刚才复制的公钥内容" >> ~/.ssh/authorized_keys

      注意: 使用 >> (追加) 而不是 > (覆盖),以免覆盖掉该文件中可能存在的其他公钥。确保粘贴的内容是完整且正确的公钥字符串,并且前后没有多余的空格或换行。
    • 确保 authorized_keys 文件具有正确权限:
      bash
      chmod 600 ~/.ssh/authorized_keys # 权限必须是 600 (只有所有者可读写)
  4. 退出远程服务器:
    bash
    exit

权限的重要性: SSH 服务器对 ~/.ssh 目录和 authorized_keys 文件的权限非常敏感。如果权限设置过于宽松(例如,允许组或其他用户写入),SSH 服务出于安全考虑,可能会拒绝使用该文件中的密钥进行认证。700 for ~/.ssh600 for authorized_keys 是标准且必需的。


8. 测试连接

现在,万事俱备!是时候验证你的配置是否成功了。尝试再次连接到远程服务器:

bash
ssh user@remote_host

或者,如果你在 ~/.ssh/config 中设置了别名:

bash
ssh your-alias

预期结果:

  • 理想情况: 你应该能够直接连接到远程服务器,不再提示输入密码。
  • 如果私钥设置了密码短语且未使用 SSH Agent 或 Agent 中未添加该密钥: 它会提示你输入该私钥的 密码短语 (“Enter passphrase for key ‘/home/your_user/.ssh/id_rsa’:”)。输入正确的密码短语后即可登录。
  • 如果使用了 SSH Agent 并已用 ssh-add 添加了密钥(且输入过一次密码短语): 你应该可以直接登录,无需输入密码或密码短语。

如果仍然提示输入密码:

  • 请仔细检查之前的步骤,特别是:
    • 公钥是否已正确复制并追加到远程服务器的 ~/.ssh/authorized_keys 文件中?
    • 远程服务器上的 ~/.ssh 目录权限是否为 700
    • 远程服务器上的 authorized_keys 文件权限是否为 600
    • 本地私钥文件的权限是否为 600
    • 如果你使用了 ~/.ssh/config 文件,检查 IdentityFile 指令是否指向了正确的私钥文件路径?
    • 服务器端的 SSH 配置 (/etc/ssh/sshd_config) 是否允许公钥认证 (PubkeyAuthentication yes)?(通常默认是开启的)
    • 查看 SSH 连接时的详细日志 -v 选项:ssh -v user@remote_host,这会输出详细的调试信息,帮助定位问题。

9. 管理多个 SSH 密钥

在实际工作中,你可能需要为不同的服务(如公司服务器、个人项目、GitHub、GitLab)或不同的身份(如个人用户、管理员)使用不同的 SSH 密钥对。这是推荐的做法,可以隔离风险。

生成多个密钥:

在运行 ssh-keygen 时,使用 -f 参数指定不同的文件名:

“`bash

生成用于工作的密钥

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_work -C “[email protected]

生成用于 GitHub 的密钥

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_github -C “[email protected]
“`

这会生成 id_ed25519_work, id_ed25519_work.pub, id_rsa_github, id_rsa_github.pub 等文件。

配置使用:

  • 使用 ssh-add 添加到 Agent:
    bash
    ssh-add ~/.ssh/id_ed25519_work
    ssh-add ~/.ssh/id_rsa_github

    SSH 客户端会尝试使用 Agent 中所有可用的密钥进行认证。
  • 使用 ~/.ssh/config 文件精确指定: 这是管理多个密钥的最佳方式。在 ~/.ssh/config 文件中为每个 Host 指定对应的 IdentityFile,如之前示例所示。这样 SSH 客户端就知道对哪个主机使用哪个密钥,避免了混淆和不必要的认证尝试。

部署公钥:

确保将 对应 的公钥文件(.pub 文件)内容部署到相应的远程服务器或服务(如 GitHub 的 SSH Keys 设置页面)。


10. 安全最佳实践与注意事项

  • 保护好你的私钥: 这是最重要的!不要分享它,不要上传到公共仓库,确保其文件权限为 600。如果电脑丢失或被盗,私钥可能泄露。
  • 使用强密码短语: 为私钥设置一个强大、唯一的密码短语,作为最后一道防线。
  • 定期更换密钥: 就像更换密码一样,定期生成新的密钥对并替换旧的密钥,可以降低长期风险。
  • 限制密钥权限(服务器端):authorized_keys 文件中,可以在公钥内容前添加选项来限制该密钥的能力,例如 command="command_to_run", from="ip_address/network", no-port-forwarding, no-pty 等。这对于自动化任务或限制特定来源的访问非常有用。
  • 使用现代密钥类型: 优先选择 Ed25519 或高位数的 RSA (>=3072)。
  • 警惕 SSH Agent 转发(Forwarding): -A 选项或 ForwardAgent yes 配置允许你在跳板机(Bastion Host)上使用本地的 Agent 密钥连接到下一台服务器。这很方便,但也存在安全风险(如果跳板机被攻破,攻击者可能利用转发的 Agent 连接)。谨慎使用。
  • 备份你的公钥: 私钥极其重要不能丢,但公钥是需要部署到各处的,备份一下公钥文件(.pub)或其内容有时也挺方便。

11. 常见问题与故障排查

  • Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password): 这是最常见的错误。意味着服务器拒绝了所有尝试的认证方法,包括你的公钥。检查点:
    • 公钥是否已正确添加到服务器的 authorized_keys
    • 服务器端 ~/.sshauthorized_keys 的权限是否正确(700 和 600)?
    • 本地私钥权限是否正确(600)?
    • ~/.ssh/config 中的 IdentityFile 是否指向了正确的私钥?
    • 服务器 SSHD 配置是否允许公钥认证?
    • 尝试 ssh -v user@host 查看详细日志。
  • Agent admitted failure to sign using the key: SSH Agent 无法使用密钥签名。可能原因:
    • 密钥未添加到 Agent (ssh-add)。
    • Agent 未运行或当前 shell 无法连接到 Agent (eval "$(ssh-agent -s)")。
    • 添加密钥时输入的密码短语错误。
  • Warning: Permanently added ‘hostname,ip’ (ED25519) to the list of known hosts: 第一次连接到一个新的服务器时,SSH 会显示这个信息,询问你是否信任该服务器的主机密钥。输入 yes 后,服务器的公钥指纹会保存在你本地的 ~/.ssh/known_hosts 文件中。这不是错误,是正常的安全确认过程。
  • WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!: 如果你之前连接过某服务器,但这次连接时服务器的主机密钥变了(可能是服务器重装系统、IP地址被重新分配给不同机器等),SSH 会发出此警告并阻止连接,以防中间人攻击。你需要确认情况,如果确定是正常变更,可以按照提示删除 ~/.ssh/known_hosts 文件中对应的旧条目,然后再重新连接。

结语

恭喜你!通过本篇详细教程,你已经掌握了使用 ssh-keygen 生成和配置 SSH 密钥对的全过程。从理解基本原理,到生成密钥、配置客户端、部署公钥,再到掌握 SSH Agent 和 config 文件的高级用法,你现在拥有了告别繁琐且不安全的密码登录、拥抱更安全、更便捷的 SSH 密钥认证方式的能力。

SSH 密钥不仅是安全远程访问的基石,也是自动化运维、持续集成/持续部署(CI/CD)流程中的关键组件。熟练运用 SSH 密钥,将大大提升你的工作效率和系统的安全性。

记住,安全是一个持续的过程。请务必遵循最佳实践,妥善保管你的私钥,并根据需要定期更新你的知识和配置。希望这篇文章能成为你探索更安全、更高效的远程工作方式的得力助手!

发表评论

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

滚动至顶部