创建 SSH Key 必备:ssh-keygen 用法全解析 – wiki基地


创建 SSH Key 必备:ssh-keygen 用法全解析

在现代网络通信中,安全和高效是永恒的主题。SSH (Secure Shell) 作为一种加密的网络协议,为我们提供了在不安全网络中安全传输数据的方式,常用于远程登录、文件传输以及隧道建立。而 SSH Key 认证,作为 SSH 最安全、最便捷的认证方式之一,正日益取代传统的密码认证。它通过非对称加密技术,使用一对公钥和私钥来进行身份验证,极大地提高了安全性并简化了登录流程。

要使用 SSH Key 认证,第一步也是最关键的一步,就是生成这对公钥和私钥。完成这一任务的便是 OpenSSH 工具集中的核心命令之一:ssh-keygen

本文将带你深入了解 ssh-keygen 命令的方方面面,从基础用法到高级选项,从密钥类型到安全实践,助你全面掌握 SSH Key 的生成与管理。

第一部分:理解 SSH Key 认证的工作原理

在深入 ssh-keygen 之前,我们先快速回顾一下 SSH Key 认证的基本原理。

  1. 非对称加密:SSH Key 认证基于非对称加密算法。这意味着存在一对相关的密钥:一个公钥 (Public Key) 和一个私钥 (Private Key)。

    • 公钥:可以公开分享,用于加密数据或验证签名。
    • 私钥:必须严格保密,用于解密数据或创建签名。两者数学上相关,但从公钥难以推导出私钥。
  2. 认证过程简述

    • 用户在本地机器上使用 ssh-keygen 生成一对密钥:id_rsa (私钥,文件名示例) 和 id_rsa.pub (公钥,文件名示例)。
    • 用户将生成的公钥 (id_rsa.pub 的内容) 复制到需要访问的远程服务器上,并将其添加到服务器用户家目录下 .ssh/authorized_keys 文件中。
    • 当用户尝试使用 SSH 连接到服务器时,服务器会向客户端发送一个随机挑战 (Challenge)。
    • 客户端使用其私钥对这个挑战进行签名。
    • 客户端将签名后的响应发送回服务器。
    • 服务器使用存储在 authorized_keys 中的客户端公钥来验证这个签名。
    • 如果签名验证成功,服务器确认客户端拥有匹配的私钥,从而允许连接,无需输入密码。

相比密码认证,SSH Key 认证的优势显而易见:它不通过网络传输实际的密码,避免了密码被窃听的风险;密钥长度远超普通密码的复杂性,更难被暴力破解;配合 ssh-agent 可以实现无密码登录,极大提升了便利性。

第二部分:初识 ssh-keygen 命令

ssh-keygen 是 OpenSSH 套件中的一个命令行工具,主要用于生成、管理和转换认证密钥。最常用的功能就是生成新的密钥对。

基本语法:

bash
ssh-keygen [options]

不带任何参数执行 ssh-keygen 会发生什么?

这是 ssh-keygen 最简单的用法。当你直接在终端输入 ssh-keygen 并回车时:

bash
$ ssh-keygen

程序会进入一个交互式流程:

  1. 提示选择密钥保存路径:
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/your_user/.ssh/id_rsa):

    默认路径通常是 ~/.ssh/id_rsa。如果你直接回车,就会使用这个默认路径。如果该路径下已经存在同名密钥文件,它会提示你是否覆盖 (Overwrite)。注意:覆盖会永久删除旧密钥! 如果你想保留旧密钥并创建新的,应输入一个不同的文件路径。

  2. 提示输入密钥密码 (Passphrase):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:

    Passphrase 是对私钥文件本身的加密。每次使用私钥时,如果设置了 Passphrase,都需要输入它来解锁私钥。

    • 输入 Passphrase 并回车,会要求你再次确认输入。
    • 直接回车 (即输入空密码),则表示不设置 Passphrase。
      设置 Passphrase 可以为私钥提供额外的安全层,即使私钥文件被盗,没有 Passphrase 也无法使用。但它也会带来每次使用私钥都需要输入密码的麻烦,可以通过 ssh-agent 解决。
  3. 生成密钥对:
    输入完 Passphrase (或选择空密码) 后,ssh-keygen 会开始生成密钥对。完成后,它会显示密钥的保存位置、指纹 (Fingerprint) 和随机艺术图案 (Randomart image)。

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

默认生成的文件:

在默认路径 ~/.ssh/ 下,你会看到两个新文件:

  • id_rsa: 这是私钥文件极其重要! 必须严格保密,权限通常应设置为 600 (只有文件所有者可读写)。
  • id_rsa.pub: 这是公钥文件。可以安全地分发给任何需要你访问的服务器。权限通常为 644 (所有者可读写,其他人只读)。

请注意,不带参数的 ssh-keygen 在较新版本的 OpenSSH 中默认生成的是 RSA 类型的密钥,长度通常为 3072 位或 2048 位 (取决于版本配置)。

第三部分:核心用法与常用选项详解

ssh-keygen 提供了丰富的选项,用于定制密钥生成的过程。掌握这些常用选项是高效使用 ssh-keygen 的关键。

-t <type>:指定密钥类型

这是最重要的选项之一,用于指定要生成的密钥算法类型。OpenSSH 支持多种算法:

  • rsa (RSA): 最常用的非对称加密算法。曾经是默认类型,现在仍然广泛使用。
  • dsa (DSA): 数字签名算法。由于安全原因,现在已被弃用且不推荐使用。在较新版本的 OpenSSH 中可能不再支持生成或默认禁用。
  • ecdsa (ECDSA): 基于椭圆曲线的数字签名算法。相比 RSA,在相同安全强度下,密钥长度更短,性能更高。支持的曲线包括 nistp256, nistp384, nistp521
  • ed25519 (Ed25519): 基于 Edwards 曲线的更现代的数字签名算法。被认为是目前最安全、最快速、且易于实现的密钥类型之一,且生成随机性不易出错。强烈推荐使用

示例:生成一个 Ed25519 类型的密钥

bash
ssh-keygen -t ed25519

示例:生成一个 ECDSA 密钥,使用 nistp521 曲线

bash
ssh-keygen -t ecdsa -b 521 # -b 选项在这里指定曲线位数

-b <bits>:指定密钥长度 (仅适用于 RSA, DSA, ECDSA)

用于指定密钥的长度(位数)。密钥长度越长,安全性越高,但生成和使用的计算成本也越大。

  • RSA: 推荐至少 2048 位,最好是 3072 位或 4096 位。OpenSSH 默认通常是 3072 位或 2048 位。
  • DSA: 固定 1024 位,已不推荐使用。
  • ECDSA: 位数与曲线相关,常见的有 256、384、521 位。指定 -b 时,实际上是指定曲线的位数。如 -b 521 对应 nistp521 曲线。
  • Ed25519: 位数是固定的 (256 位),因此不能与 -b 选项一起使用。Ed25519 256 位的安全强度被认为至少等同于 RSA 2048 位,甚至 3072 位。

示例:生成一个 4096 位的 RSA 密钥

bash
ssh-keygen -t rsa -b 4096

-C <comment>:添加注释

在公钥文件 (.pub 文件) 的末尾添加注释。这个注释通常用于标识密钥的用途、所有者或生成时间,非常有用。默认注释是 user@hostname

示例:生成一个带有注释的 Ed25519 密钥

bash
ssh-keygen -t ed25519 -C "my-github-key-on-laptop"

生成的 id_ed25519.pub 文件内容可能类似于:

ssh-ed25519 AAAA... <comment>

-f <filename>:指定密钥文件的保存路径和名称

如果你不想使用默认的 ~/.ssh/id_rsa,可以使用 -f 选项指定密钥对的保存路径和文件名。生成的私钥文件就是你指定的名称,公钥文件会在其后加上 .pub

示例:生成一个名为 my_web_server_key 的 RSA 密钥

bash
ssh-keygen -t rsa -f ~/.ssh/my_web_server_key

这会在 ~/.ssh/ 目录下生成 my_web_server_key (私钥) 和 my_web_server_key.pub (公钥)。

-N <new_passphrase>:设置新的 Passphrase (非交互式)

这个选项用于在生成密钥时直接指定 Passphrase,而无需交互式输入。使用时需谨慎,因为命令本身和历史记录中可能会暴露 Passphrase。通常用于脚本自动化,但存在安全风险。

示例:生成一个带有指定 Passphrase 的 Ed25519 密钥 (不推荐在交互式终端直接使用)

bash
ssh-keygen -t ed25519 -N "YourSecretPassphrase" -f ~/.ssh/automatic_key

更安全的做法是配合其他工具(如 read 命令)从变量或文件中读取 Passphrase。

-P <passphrase>:提供旧的 Passphrase (用于更改 Passphrase)

这个选项用于在更改现有密钥的 Passphrase 时提供旧的 Passphrase。同样,直接在命令行中指定 Passphrase 存在安全风险。

-q: 安静模式 (Quiet mode)

生成密钥时不显示进度条和大多数提示信息,只输出必要的错误信息。常用于自动化脚本。

示例:安静地生成一个 Ed25519 密钥

bash
ssh-keygen -t ed25519 -q -N "" # -N "" 表示不设置 Passphrase

-v: 详细模式 (Verbose mode)

显示更详细的输出信息,用于调试或了解生成过程。

示例:详细模式生成 RSA 密钥

bash
ssh-keygen -v -t rsa

组合使用示例

生成一个 4096 位的 RSA 密钥,保存在 ~/.ssh/backup_server_rsa,设置 Passphrase,并添加注释:

“`bash
ssh-keygen -t rsa -b 4096 -f ~/.ssh/backup_server_rsa -C “backup-server-access”

此时会交互式提示输入 Passphrase

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
“`

生成一个 Ed25519 密钥,不设置 Passphrase,保存在默认位置,并添加注释:

“`bash
ssh-keygen -t ed25519 -N “” -C “my-main-laptop-key”

会提示是否覆盖默认文件,如果不存在则直接生成

“`

第四部分:密钥类型与安全性深度分析

选择合适的密钥类型和长度对于保证 SSH 连接的安全至关重要。

  • RSA: 老牌算法,经过了长时间的密码学考验。安全性依赖于大整数分解的难度。推荐长度至少 3072 位,最好 4096 位。小于 2048 位的 RSA 密钥被认为不够安全。
  • DSA: 存在一些设计上的缺陷和实现上的风险(特别是随机数生成问题),且固定 1024 位长度在当前环境下已不安全。不推荐使用
  • ECDSA: 椭圆曲线密码学 (ECC) 通常可以在更短的密钥长度下提供与传统算法 (如 RSA) 相同的安全强度,因此效率更高。例如,ECDSA 256 位通常被认为等同于 RSA 3072 位。然而,ECDSA 对随机数的要求非常严格,如果随机数生成器有问题,可能导致密钥被破解(历史上曾有案例)。OpenSSH 支持 NIST 标准曲线 (nistp256, nistp384, nistp521)。
  • Ed25519: 基于 Edwards 曲线,是 Daniel J. Bernstein 设计的一种签名算法。它具有以下优点:
    • 高安全性:基于 Edwards 曲线,抗侧信道攻击能力较强。
    • 高性能:签名和验证速度非常快。
    • 简洁性:算法设计更简洁,不易出错。
    • 固定长度:256 位,安全强度高。

总结密钥类型推荐:

  • 首选 Ed25519:如果你的 SSH 客户端和服务器都支持 Ed25519 (现代系统通常都支持),这是最佳选择,兼顾安全、性能和实现健壮性。
  • 次选 RSA 4096 位:如果由于兼容性原因需要使用 RSA,请务必使用 4096 位长度以确保足够的安全强度。3072 位也可接受,但 2048 位应尽量避免用于新的重要应用。
  • 避免使用 DSA:已不安全且弃用。
  • 谨慎使用 ECDSA:虽然性能好,但对实现要求高,且历史上出现过随机数问题导致的安全漏洞。如果你理解其原理并确定你的系统实现了安全的随机数生成,可以使用,但 Ed25519 通常是更好的 ECC 选择。

第五部分:密钥密码 (Passphrase) 的意义与管理

Passphrase 是对私钥文件本身的加密。设置 Passphrase 后,每次 SSH 客户端需要读取私钥(例如,尝试连接到服务器时)都会要求你输入这个密码来解密私钥文件。

为什么要设置 Passphrase?

为私钥设置 Passphrase 提供了额外的安全层。如果你的电脑被盗或私钥文件意外泄露,没有 Passphrase,攻击者将无法直接使用你的私钥进行认证。这大大降低了私钥泄露的风险。

什么时候可以不设置 Passphrase?

在某些自动化场景下,比如脚本或自动化部署,需要无人值守地使用 SSH 密钥进行认证。此时,设置 Passphrase 会阻碍自动化流程,因此可以选择不设置 Passphrase (即生成时输入空密码)。但这会牺牲安全性,因为任何获得私钥文件的人都可以直接使用它。在这种情况下,务必采取其他措施保护私钥文件,例如严格的文件权限、限制访问私钥的机器、以及在脚本完成后及时删除密钥(如果可能)。

设置、更改或移除 Passphrase

ssh-keygen 命令本身也可以用来管理现有密钥的 Passphrase。

  • 更改现有密钥的 Passphrase:使用 -p 选项。

    “`bash
    ssh-keygen -p -f ~/.ssh/id_rsa

    会提示你输入旧的 Passphrase,然后输入新的 Passphrase (可为空)

    Enter old passphrase:
    Enter new passphrase (empty for no passphrase):
    Enter same passphrase again:
    “`

  • 移除现有密钥的 Passphrase:同样使用 -p 选项,但在提示输入新的 Passphrase 时直接回车。

    bash
    ssh-keygen -p -f ~/.ssh/id_rsa
    Enter old passphrase:
    Enter new passphrase (empty for no passphrase): # 直接回车
    Enter same passphrase again: # 直接回车

使用 ssh-agent 管理 Passphrase

对于设置了 Passphrase 的密钥,每次使用都需要输入密码是很繁琐的。ssh-agent 工具就是为了解决这个问题而设计的。

ssh-agent 是一个在后台运行的小程序,它可以“记住”你输入的 Passphrase。当你使用 ssh-add 命令将私钥添加到 ssh-agent 时,它会要求你输入一次 Passphrase 来解锁私钥,然后将解锁后的私钥信息存储在内存中。之后,当你使用 SSH 连接时,SSH 客户端会自动与 ssh-agent 通信,由 ssh-agent 使用已解锁的私钥进行认证,而无需你再次输入 Passphrase。

这是一种非常方便且相对安全的方式,既享受了 Passphrase 带来的安全保护,又避免了频繁输入密码的麻烦。现代桌面环境通常会自动启动 ssh-agent,并与图形界面集成,有时甚至可以在用户登录时自动将默认密钥添加到代理中。

第六部分:高级用法与进阶选项

ssh-keygen 还提供了一些用于密钥管理的进阶选项。

-L: 查看公钥或私钥的详细信息和指纹

这个选项用于显示指定密钥文件的详细信息,包括密钥类型、长度、指纹以及关联的注释。

bash
ssh-keygen -L -f ~/.ssh/id_rsa

输出示例:

/home/your_user/.ssh/id_rsa:
Type: RSA
Length: 3072
Comment: your_user@your_hostname
SHA256:..........................................
MD5:..............................................

对于公钥文件 (.pub) 也可以使用:

bash
ssh-keygen -L -f ~/.ssh/id_rsa.pub

-y: 从私钥文件中提取公钥

如果你只有私钥文件,可以使用 -y 选项从中提取出对应的公钥。这在你不小心删除了 .pub 文件但还保留着私钥时非常有用。

bash
ssh-keygen -y -f ~/.ssh/id_rsa

输出就是对应的公钥内容,可以直接复制粘贴到 authorized_keys 或保存为 .pub 文件。

ssh-rsa AAAA.......................................... your_user@your_hostname

-i: 导入非 OpenSSH 格式的公钥

有些系统或工具生成的公钥可能不是 OpenSSH 默认的格式。-i 选项可以将这些公钥转换为 OpenSSH 格式。

bash
ssh-keygen -i -f /path/to/other_format_key.pub

输出即为 OpenSSH 格式的公钥。

-e: 导出 OpenSSH 格式的公钥到其他格式

-i 相反,-e 选项可以将 OpenSSH 格式的公钥转换为其他格式,例如 RFC 4716 或 PKCS#8。

bash
ssh-keygen -e -f ~/.ssh/id_rsa.pub

-A: 生成所有标准主机密钥类型 (通常用于服务器)

这个选项通常用于服务器端,而不是生成用户密钥。它会检查 /etc/ssh/ 目录下是否存在标准的主机密钥(如 ssh_host_rsa_key, ssh_host_ed25519_key 等),如果不存在,则为其生成一对。这对于首次设置 SSH 服务器非常方便。

bash
sudo ssh-keygen -A

运行此命令后,SSH 服务端将拥有多种类型的主机密钥,客户端连接时可以协商使用最强的共同支持的密钥类型。

其他选项 (简略提及)

  • -B: 显示密钥的 Bubble Babble 指纹(一种可读性较差的指纹格式,较少使用)。
  • -F <hostname>: 在 known_hosts 文件中查找指定主机的所有条目。
  • -R <hostname>: 从 known_hosts 文件中移除指定主机的条目(用于解决主机密钥变更警告)。
  • -H: 对 known_hosts 文件进行哈希处理,增加隐私性。
  • -K: load resident keys from a FIDO authenticator (涉及硬件密钥,较高级)。
  • -U: write resident keys to a FIDO authenticator (涉及硬件密钥,较高级)。

第七部分:密钥文件管理与权限

生成的 SSH 密钥文件通常保存在用户家目录下的 .ssh/ 隐藏目录中。这个目录和其中的文件需要设置正确的权限,以防止他人访问你的私钥。

标准的权限设置:

  • .ssh/ 目录:700 (只有文件所有者有读、写、执行权限)
    bash
    chmod 700 ~/.ssh
  • 私钥文件 (id_rsa, id_ed25519, 等):600 (只有文件所有者有读、写权限)
    bash
    chmod 600 ~/.ssh/id_rsa
    # 或者针对你生成的具体私钥文件
    chmod 600 ~/.ssh/my_custom_key
  • 公钥文件 (id_rsa.pub, id_ed25519.pub, 等):644 (文件所有者有读写权限,其他人只有读权限)
    bash
    chmod 644 ~/.ssh/id_rsa.pub
    # 或者针对你生成的具体公钥文件
    chmod 644 ~/.ssh/my_custom_key.pub
  • authorized_keys 文件:600 (在服务器上,只有服务器用户有读写权限)
    bash
    chmod 600 ~/.ssh/authorized_keys

为什么权限如此重要?

SSH 客户端和服务器在进行密钥认证时,会检查密钥文件的权限。如果私钥文件权限过于开放 (例如 644 或 666),SSH 客户端会发出警告甚至拒绝使用该私钥,因为它认为这个私钥可能已被非授权用户访问或篡改,存在安全风险。同样,服务器上的 authorized_keys 文件权限如果设置不当,也可能导致密钥认证失败。

第八部分:实践示例

通过一些具体的例子来巩固 ssh-keygen 的使用。

示例 1:生成默认的 RSA 密钥 (带 Passphrase)

bash
ssh-keygen

  • 按回车接受默认文件路径 (~/.ssh/id_rsa)。
  • 输入并确认你的 Passphrase。
  • 生成 ~/.ssh/id_rsa~/.ssh/id_rsa.pub

示例 2:生成 Ed25519 密钥 (不带 Passphrase,自定义文件名和注释)

bash
ssh-keygen -t ed25519 -f ~/.ssh/github_ed25519 -C "github-access-on-laptop" -N ""

  • -t ed25519 指定密钥类型。
  • -f ~/.ssh/github_ed25519 指定文件路径和名称,生成 github_ed25519github_ed25519.pub
  • -C "github-access-on-laptop" 添加注释。
  • -N "" 指定新的 Passphrase 为空 (即不设置 Passphrase)。

示例 3:生成 4096 位 RSA 密钥 (用于重要服务器,带 Passphrase)

“`bash
ssh-keygen -t rsa -b 4096 -f ~/.ssh/prod_server_rsa -C “prod-server-admin-key”

交互式输入 Passphrase

“`

  • -t rsa -b 4096 指定 RSA 类型和 4096 位长度。
  • -f ~/.ssh/prod_server_rsa 指定文件路径和名称。
  • -C "prod-server-admin-key" 添加注释。
  • 接下来会提示输入 Passphrase。

示例 4:更改现有密钥的 Passphrase

假设要更改 ~/.ssh/id_rsa 的 Passphrase。

“`bash
ssh-keygen -p -f ~/.ssh/id_rsa

提示输入旧 Passphrase 和新 Passphrase

“`

示例 5:从私钥文件中提取公钥

假设 ~/.ssh/my_key 是你的私钥,但 .pub 文件丢失了。

bash
ssh-keygen -y -f ~/.ssh/my_key

将输出的内容复制出来,保存为 ~/.ssh/my_key.pub

示例 6:查看公钥指纹

生成密钥后,或者需要验证公钥是否正确时,可以查看其指纹。服务器端也常常显示公钥指纹供用户确认。

“`bash
ssh-keygen -L -f ~/.ssh/id_rsa.pub

或者只看指纹

ssh-keygen -l -f ~/.ssh/id_rsa.pub # 注意是小写 l
“`

第九部分:安全最佳实践

使用 ssh-keygen 创建和管理 SSH 密钥时,遵循一些安全最佳实践至关重要:

  1. 为私钥设置强 Passphrase:除非绝对需要自动化,否则强烈建议为你的私钥设置一个强壮的 Passphrase。将其视为你的主密码,但不要与你的登录密码或其他重要密码重复。
  2. 使用 ssh-agent:结合 ssh-agent 使用带 Passphrase 的密钥,可以让你享受安全性的同时避免重复输入密码的麻烦。配置你的系统在登录时自动启动 ssh-agent 并加载常用密钥。
  3. 使用推荐的密钥类型和长度:首选 Ed25519。如果需要 RSA,确保长度至少 3072 位,最好 4096 位。避免使用 DSA。
  4. 保护好你的私钥文件
    • 权限:确保私钥文件 (~/.ssh/id_rsa 等) 的权限设置为 600.ssh 目录权限设置为 700
    • 不共享:绝不将你的私钥文件分享给任何人或任何不信任的机器。
    • 不上传:除了需要你访问的远程服务器上的 authorized_keys 文件之外,不要将你的私钥上传到任何其他地方 (包括 GitHub、GitLab 等的代码仓库,尽管它们通常会忽略这些文件,但本地误操作可能导致泄露)。公钥 (.pub 文件) 是可以安全分发的。
  5. 使用不同的密钥对:考虑为不同的目的或不同的服务生成不同的密钥对。例如,一个用于访问生产服务器,一个用于访问开发服务器,一个用于 GitHub。这样,即使一个密钥对泄露,也不会影响到其他服务的安全性。使用 -f 选项指定不同的文件名来生成多个密钥对。
  6. 定期审查 authorized_keys 文件:在你管理的服务器上,定期检查 ~/.ssh/authorized_keys 文件,移除不再需要或不认识的公钥。
  7. 禁用密码认证:在服务器端配置 SSH 服务 (sshd_config) 禁用密码认证 (PasswordAuthentication no),只允许公钥认证,可以显著提高安全性,防止密码被暴力破解。
  8. 备份密钥:在安全的地方备份你的私钥文件和 Passphrase。但要确保备份方式本身是安全的(例如加密存储)。

第十部分:常见问题与故障排除

在使用 ssh-keygen 和 SSH Key 认证过程中,可能会遇到一些常见问题。

  1. “Permissions too open” 错误:这是最常见的问题,通常是因为你的私钥文件或 .ssh 目录权限设置不正确导致的。SSH 客户端检测到权限过于开放,为了安全而拒绝使用。解决方法是按照前面的指引设置正确的权限 (chmod 700 ~/.ssh, chmod 600 ~/.ssh/id_rsa)。
  2. “Bad permissions” 错误:在服务器端,如果 ~/.ssh 目录或 ~/.ssh/authorized_keys 文件的权限设置不正确,SSH 服务端会拒绝使用 authorized_keys 文件。确保服务器上的 ~/.ssh 权限是 700authorized_keys 权限是 600
  3. Passphrase 输入错误:如果设置了 Passphrase,但在使用密钥时输入错误,会提示认证失败。请仔细检查大小写和字符。
  4. 公钥未添加到服务器的 authorized_keys 文件:确保你将正确的公钥内容完整复制到了服务器用户家目录下 .ssh/authorized_keys 文件的末尾,并且没有额外的空行或格式错误。每行一个公钥。
  5. SSH 服务器配置问题:服务器的 SSH 服务 (sshd) 可能没有开启公钥认证 (PubkeyAuthentication yes),或者禁用了你使用的密钥类型。检查服务器的 /etc/ssh/sshd_config 文件。修改配置后需要重启 SSH 服务 (sudo systemctl restart sshdsudo service sshd restart)。
  6. 客户端使用的私钥不正确:如果你生成了多个密钥对,或者密钥文件名不是默认的 id_rsa,SSH 客户端默认可能找不到正确的私钥。你可以使用 ssh -i /path/to/your/private_key user@host 明确指定私钥文件,或者在客户端的 ~/.ssh/config 文件中为特定主机配置使用的密钥。
  7. 防火墙问题:虽然不是 ssh-keygen 的问题,但防火墙可能阻止 SSH 连接(默认端口 22)。确保客户端和服务器之间的防火墙允许 SSH 流量通过。
  8. SELInux/AppArmor 等安全增强模块限制:在一些 Linux 系统上,SELInux 或 AppArmor 可能限制 SSH 访问用户家目录下的文件。确保相关策略允许 SSH 读取 .ssh 目录和其中的文件。这通常是系统级别的配置问题,可能需要管理员权限解决。

总结

ssh-keygen 是 SSH Key 认证的基础工具,掌握其用法对于构建安全、高效的远程访问至关重要。从基本的生成命令到复杂的选项组合,从理解密钥类型到实践安全防护,本文详细解析了 ssh-keygen 的核心功能。

通过合理选择密钥类型和长度,为私钥设置强 Passphrase 并结合 ssh-agent 使用,以及严格管理密钥文件的权限,你可以最大限度地发挥 SSH Key 认证的优势,告别繁琐且不安全的密码,迈向更加安全的无密码远程访问体验。

希望这篇详细解析能够帮助你全面掌握 ssh-keygen 的使用,并能在日常工作中更加自如和安全地进行 SSH 连接。祝你在使用 SSH Key 的过程中顺利无阻!


发表评论

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

滚动至顶部