创建 SSH Key 详细步骤 – wiki基地


告别繁琐密码,拥抱 SSH Key 的高效与安全:详细创建指南

在日常的服务器管理、代码版本控制(如 Git)以及各种需要远程安全连接的场景中,SSH(Secure Shell)协议扮演着至关重要的角色。它提供了一种加密的方式来安全地访问远程计算机。传统的 SSH 认证方式是基于密码的,但这存在一些固有的问题:密码容易被猜测或通过暴力破解攻击获取,而且频繁输入复杂密码既不方便也不安全。

SSH 密钥(SSH Key)提供了一种更安全、更便捷的认证方式。它基于非对称加密原理,使用一对密钥:一个私钥(Private Key)和一个公钥(Public Key)。你可以将公钥部署到你需要访问的远程服务器上,而私钥则保留在你的本地计算机上。当你尝试连接时,SSH 客户端使用你的私钥向服务器证明你的身份,服务器则使用对应的公钥进行验证。这个过程是加密的,且无需传输私钥,极大地提高了安全性。

使用 SSH Key 的主要优势包括:

  1. 更高的安全性: 密钥对通常比密码更长、更复杂,难以猜测或暴力破解。私钥永不离开你的本地设备,降低了泄露风险。
  2. 更便捷的连接: 设置完成后,连接远程服务器通常无需再次输入密码(除非你为私钥设置了密码短语)。这对于自动化脚本和频繁连接非常有用。
  3. 更灵活的权限管理: 可以为不同的用户或用途生成不同的密钥对,并将其部署到不同的服务器上,实现精细化的权限控制。

既然 SSH Key 如此重要且优越,那么如何创建和使用它呢?本文将为你提供一个详尽的步骤指南,带你从零开始生成 SSH Key,并了解如何将其部署到远程服务器上。

第一部分:创建 SSH Key 密钥对

创建 SSH Key 的过程主要通过命令行工具 ssh-keygen 来完成。无论你使用的是 Linux、macOS 还是 Windows 系统,现代的操作系统环境或安装了 Git 等工具后,通常都内置或捆绑了 OpenSSH 客户端工具,包括 ssh-keygen 命令。

前提条件:

  • 一台运行 Linux、macOS 或 Windows 的计算机。
  • 可以访问命令行终端(Terminal、Command Prompt、PowerShell 或 Git Bash 等)。

步骤 1:打开终端或命令行工具

  • Linux/macOS: 打开终端应用程序(Terminal)。通常在“应用程序” -> “实用工具”或通过搜索找到。
  • Windows:
    • 如果你安装了 Git,可以使用 Git Bash(推荐,因为它提供了更接近 Linux 的环境)。
    • 如果你使用的是 Windows 10/11,可以通过安装 OpenSSH 客户端功能(在“设置” -> “应用” -> “可选功能”中管理)后使用 PowerShell 或命令提示符。
    • 使用 Windows Subsystem for Linux (WSL) 中的 Linux 终端。

步骤 2:运行 ssh-keygen 命令

在终端中输入以下命令来启动密钥生成过程:

bash
ssh-keygen

这是一个基本命令,它会使用默认设置(通常是 RSA 算法,2048 位长度)生成密钥对。但在实际应用中,我们通常会添加一些选项来定制密钥:

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

让我们解释一下这些选项:

  • -t [type]:指定要生成的密钥类型。
    • rsa:RSA 是传统的密钥类型,兼容性最好。建议使用至少 -b 4096 参数指定位长,例如 ssh-keygen -t rsa -b 4096
    • ed25519:Eddsa 是较新的密钥类型,更短、更快,且在同等安全级别下通常被认为更优。推荐优先使用 Ed25519 算法,除非你需要连接的旧系统不支持它。
    • 还有其他类型如 dsaecdsa,但通常不推荐使用(DSA 已不安全,ECDSA 相对较新但 Ed25519 更有优势)。
  • -C "[comment]":为公钥添加一个注释。这个注释不会影响密钥的功能,但可以帮助你识别密钥的用途或所有者。通常使用你的电子邮件地址或一个描述性字符串。

示例命令(推荐使用 Ed25519):

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

示例命令(如果需要 RSA 兼容性,使用 4096 位):

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

输入命令后,按下 Enter 键。

步骤 3:选择密钥文件的保存位置

ssh-keygen 会询问你希望将密钥文件保存在哪里:

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

默认位置是用户主目录下的 .ssh 隐藏文件夹内,文件名为 id_[key_type](例如 id_ed25519id_rsa)作为私钥,以及 id_[key_type].pub 作为公钥。

  • 推荐: 对于大多数用户而言,直接按 Enter 接受默认位置和文件名是最好的选择。SSH 客户端在连接时会自动查找这个默认位置的密钥文件。
  • 自定义: 如果你需要为不同的用途或服务器创建多个密钥对,或者想将密钥保存在其他位置,可以输入一个不同的路径和文件名,例如 /home/your_username/.ssh/my_server_key。如果你输入 my_server_key,那么私钥文件将是 my_server_key,公钥文件将是 my_server_key.pub注意: 如果你指定了非默认位置和文件名,将来在使用 SSH 连接时,可能需要通过 -i 参数或在 SSH 配置文件 (~/.ssh/config) 中指定这个密钥文件。

输入路径后,按下 Enter 键。如果该文件或目录已存在,系统会询问你是否覆盖。请谨慎操作,覆盖会丢失旧的密钥。

步骤 4:设置密码短语 (Passphrase)

接下来,系统会询问你是否为私钥设置一个密码短语 (passphrase):

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

  • 什么是密码短语? 密码短语是一个额外的安全层,它会在每次使用私钥进行认证时要求输入。即使你的私钥文件被盗,没有密码短语也无法使用它。密码短语可以是任意长度的字符串,包括空格和标点符号,越长越复杂越好。
  • 是否需要设置?
    • 建议设置: 对于大多数用途,尤其是在笔记本电脑等可能丢失的设备上,强烈建议设置一个强密码短语。这显著提高了私钥被盗后的安全性。
    • 不设置: 如果你需要进行自动化操作(例如脚本自动连接服务器或 Git 仓库),并且无法或不愿意集成 SSH 代理来管理密码短语,那么可以选择留空(直接按 Enter )。但请注意,这会降低私钥文件的安全性。
  • 输入: 输入你的密码短语,然后按 Enter。系统会要求你再次输入以确认。当你输入密码短语时,屏幕上不会显示任何字符(这是正常的安全行为)。

如果你选择不设置密码短语,直接在两提示处都按 Enter 即可。

步骤 5:完成密钥生成

设置完密码短语(或选择跳过)后,ssh-keygen 会生成密钥对并显示一些信息:

Your identification has been saved in /home/your_username/.ssh/id_ed25519
Your public key has been saved in /home/your_username/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX [email protected]_or_a_description
The key's randomart image is:
+--[ED25519 256]--+
| .+Eo= |
| . + *. |
| o . . |
| + . |
| S . |
| + * |
| + B . |
| o B = |
| oo+*+ |
+----[SHA256]-----+

这些信息表明密钥对已成功生成:

  • Your identification has been saved in ...:这是你的私钥文件路径。请务必保护好这个文件,不要泄露给任何人!
  • Your public key has been saved in ...:这是你的公钥文件路径。这个文件是可以安全地分享给需要你通过 SSH 访问的服务器、Git 仓库等。
  • The key fingerprint is...:密钥指纹,用于验证公钥的真实性,通常在首次连接未知主机时会显示出来让你确认。
  • The key's randomart image is...:一个可视化表示密钥指纹的随机艺术图像,也可以帮助你直观地识别和确认密钥。

至此,你已经在本地计算机上成功创建了一对 SSH 密钥。

第二部分:理解密钥文件和默认位置

成功生成密钥后,你会发现在指定的位置(默认是 ~/.ssh/ 目录)生成了两个文件:

  • id_[key_type](例如 id_ed25519id_rsa):这是你的私钥文件。它包含用于解密的私密信息,是认证的核心。绝对不要分享或泄露这个文件。在 Linux/macOS 系统中,它的权限通常会被自动设置为 600(只有所有者有读写权限),这是为了安全。如果你手动复制或移动了私钥文件,请确保它的权限是 600
  • id_[key_type].pub(例如 id_ed25519.pubid_rsa.pub):这是你的公钥文件。它包含用于加密和验证的公开信息。你可以将这个文件的内容复制到任何你需要使用 SSH Key 认证的远程服务器上。这个文件是设计为可以公开的。在 Linux/macOS 系统中,它的权限通常是 644(所有者可读写,其他人只读)。

默认位置 ~/.ssh/

在类 Unix 系统(Linux、macOS)中,~ 代表当前用户的主目录,所以 ~/.ssh/ 指的是你用户主目录下的 .ssh 隐藏文件夹。SSH 客户端在连接时,会默认首先查找这个目录下的 id_rsaid_ed25519 等文件作为私钥。

在 Windows 系统中,OpenSSH 客户端的默认位置通常是 %USERPROFILE%\.ssh\,其中 %USERPROFILE% 是你的用户主目录路径(例如 C:\Users\YourUsername)。如果你使用 Git Bash,则通常是 Git 安装目录下的用户主目录(例如 C:\Users\YourUsername\.ssh)。

确保 .ssh 目录本身以及其中的密钥文件拥有正确的权限也非常重要。在 Linux/macOS 上,正确的权限通常是:

  • .ssh 目录:700 (只有所有者有读、写、执行权限)
  • 私钥文件 (id_rsa, id_ed25519 等):600 (只有所有者有读写权限)
  • 公钥文件 (id_rsa.pub, id_ed25519.pub 等):644 (所有者读写,其他人只读)

你可以使用 ls -l ~/.ssh 命令查看文件权限,并使用 chmod 命令修改权限,例如:

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

注意: 如果权限设置不正确,SSH 客户端或服务器可能会拒绝使用密钥,导致认证失败。

第三部分:将公钥部署到远程服务器

创建了密钥对后,你需要将公钥.pub 文件)的内容添加到远程服务器上你的用户账户的授权密钥文件 (~/.ssh/authorized_keys) 中。这是为了告诉服务器:“如果有人使用与这个公钥匹配的私钥来连接,那么就允许他登录这个用户账户。”

有两种主要方法来完成这个任务:

方法 1:使用 ssh-copy-id 命令(推荐)

ssh-copy-id 是一个专门用于将公钥复制到远程服务器的便捷工具。它会自动处理将公钥内容追加到远程服务器用户主目录下的 ~/.ssh/authorized_keys 文件中,并设置正确的目录和文件权限。

  • 前提: 你的本地系统上安装了 ssh-copy-id 工具(大多数 Linux/macOS 系统默认安装),并且你需要有远程服务器上目标用户账户的密码(至少是第一次使用密码登录)。

  • 命令格式:

    bash
    ssh-copy-id user@remote_host

    或者,如果你使用了非默认的私钥文件:

    bash
    ssh-copy-id -i path/to/your/private_key.pub user@remote_host

    • user:远程服务器上的用户名。
    • remote_host:远程服务器的 IP 地址或域名。
    • -i path/to/your/private_key.pub:指定要复制的公钥文件路径(如果使用默认公钥,则不需要 -i 参数)。
  • 示例: 将默认公钥复制到 IP 地址为 192.168.1.100 的服务器上的 myuser 用户:

    bash
    ssh-copy-id [email protected]

  • 过程:

    1. 运行命令后,如果这是你第一次连接该服务器,会询问你是否信任该主机(显示服务器的指纹)。输入 yes 并按 Enter。
    2. 接着,系统会提示你输入远程服务器上 myuser 账户的密码。输入密码并按 Enter。
    3. ssh-copy-id 会登录到远程服务器,创建 ~/.ssh 目录(如果不存在),设置权限,然后将你的公钥内容追加到 ~/.ssh/authorized_keys 文件中(如果文件不存在则创建),并设置文件权限。
    4. 完成后,命令会报告已添加的密钥数量。

方法 2:手动复制公钥内容

如果 ssh-copy-id 工具不可用,或者你想更精细地控制过程,可以手动完成。

  • 步骤:
    1. 在本地计算机上,获取公钥文件的内容: 使用文本编辑器打开你的公钥文件 (~/.ssh/id_ed25519.pub~/.ssh/id_rsa.pub),或者使用命令行工具显示其内容。
      bash
      cat ~/.ssh/id_ed25519.pub

      复制终端或编辑器中显示的完整公钥内容。它看起来像一行很长的文本,以 ssh-ed25519ssh-rsa 开头,以你创建时指定的注释结尾。
    2. 使用密码连接到远程服务器: 使用 SSH 命令连接到目标服务器,此时你需要输入密码登录。
      bash
      ssh user@remote_host
    3. 在远程服务器上,创建或编辑 ~/.ssh/authorized_keys 文件:
      • 首先,进入你的用户主目录:cd ~
      • 创建 .ssh 目录(如果不存在):mkdir ~/.ssh
      • 设置 .ssh 目录的权限为 700chmod 700 ~/.ssh
      • 使用文本编辑器(如 nano, vimvi)打开或创建 ~/.ssh/authorized_keys 文件:nano ~/.ssh/authorized_keys
      • 将你在本地复制的公钥内容粘贴到 authorized_keys 文件的末尾。每行一个公钥。
      • 保存并关闭文件(在 nano 中是 Ctrl+X,然后输入 Y,再按 Enter)。
      • 设置 authorized_keys 文件的权限为 600chmod 600 ~/.ssh/authorized_keys

手动方法需要更多步骤,且需要注意文件和目录的权限设置,任何权限错误都可能导致密钥认证失败。

第四部分:使用 SSH Key 连接远程服务器

公钥成功部署到远程服务器后,你就可以尝试使用 SSH Key 进行连接了。

  • 命令格式:

    bash
    ssh user@remote_host

    如果你的私钥保存在默认位置 (~/.ssh/id_rsa~/.ssh/id_ed25519) 并且没有设置密码短语,或者你使用了 SSH 代理管理了密码短语,那么连接应该会直接成功,无需输入密码。

  • 如果设置了密码短语: 系统会提示你输入私钥的密码短语:

    Enter passphrase for key '/home/your_username/.ssh/id_ed25519':

    输入你之前设置的密码短语,然后按 Enter。连接成功后,你就可以开始操作远程服务器了。

  • 如果使用非默认的私钥文件: 你需要使用 -i 参数指定私钥文件路径:

    bash
    ssh -i /path/to/your/private_key user@remote_host

    例如:

    bash
    ssh -i ~/.ssh/my_server_key [email protected]

第五部分:SSH 配置文件的使用 (~/.ssh/config)

对于频繁连接的服务器或使用了多个密钥对的情况,手动输入 -i 参数或记住复杂的地址会很麻烦。你可以通过编辑本地的 SSH 配置文件 (~/.ssh/config) 来简化连接过程。

  • 文件位置: ~/.ssh/config (在你的用户主目录下创建或编辑,如果不存在的话)。
  • 格式: 包含一个或多个 Host 段落,每个段落定义一个连接别名和相关配置。

  • 示例:

    “`
    Host myserver
    Hostname 192.168.1.100
    User myuser
    Port 22
    IdentityFile ~/.ssh/id_ed25519
    # 如果你有多个密钥,或者使用了非默认密钥,可以通过 IdentityFile 指定

    Host github
    Hostname github.com
    User git
    IdentityFile ~/.ssh/github_id_rsa # 假设你为 GitHub 生成了单独的 RSA 密钥

    Host other_server
    Hostname example.com
    User admin
    Port 2222 # 指定非默认端口
    IdentityFile ~/.ssh/id_rsa # 即使不是默认文件名,也可以在这里指定
    “`

  • 使用: 保存 ~/.ssh/config 文件后,你就可以使用 Host 后面定义的别名进行连接了:

    bash
    ssh myserver # 相当于 ssh [email protected] -p 22 -i ~/.ssh/id_ed25519
    ssh github # 相当于 ssh [email protected] -p 22 -i ~/.ssh/github_id_rsa
    ssh other_server # 相当于 ssh [email protected] -p 2222 -i ~/.ssh/id_rsa

使用 ~/.ssh/config 文件可以极大地提高 SSH 连接的效率和便捷性。

第六部分:SSH 代理 (ssh-agent)

如果你为私钥设置了密码短语,那么每次使用该私钥时都需要输入密码短语。这虽然提高了安全性,但对于频繁连接来说非常麻烦。SSH 代理(ssh-agent)就是为了解决这个问题而存在的。

ssh-agent 是一个后台程序,它可以缓存你的私钥的解密版本。当你第一次使用私钥(例如第一次连接服务器)时,ssh-agent 会要求你输入一次密码短语来解锁私钥。之后,只要 ssh-agent 还在运行,所有需要使用该私钥的 SSH 连接都可以直接通过 ssh-agent 进行认证,无需再次输入密码短语。

  • 启动 ssh-agent: 在终端中运行:
    bash
    eval "$(ssh-agent -s)"

    这个命令会启动 ssh-agent 并在当前 shell 会话中设置必要的环境变量。
  • 将私钥添加到 ssh-agent:
    bash
    ssh-add ~/.ssh/id_ed25519

    或者,如果你使用了非默认私钥:
    bash
    ssh-add /path/to/your/private_key

    如果你的私钥有密码短语,ssh-add 会要求你输入一次。输入正确后,私钥就会被添加到 ssh-agent 中。
  • 验证: 你可以使用 ssh-add -l 命令查看当前 ssh-agent 中已加载的密钥。
  • 持续性: ssh-agent 通常与当前的终端会话绑定。当你关闭终端窗口时,ssh-agent 进程也会终止,缓存的密钥就会消失。一些桌面环境或系统会提供更持久的 ssh-agent 实现,可以在系统启动时启动,并在登录期间保持运行。

使用 ssh-agent 是管理带密码短语的私钥的最佳实践,它兼顾了安全性和便捷性。

第七部分:安全注意事项和最佳实践

  • 保护私钥: 你的私钥文件 (id_rsa, id_ed25519 等) 是你身份的凭证,绝对不要泄露给任何人。不要将其上传到公共代码库、不要通过不安全的渠道发送、不要保存在公共可访问的位置。
  • 使用强密码短语: 如果私钥丢失或被盗,一个强密码短语可以阻止攻击者使用你的私钥。使用一个足够长且包含各种字符组合的密码短语。
  • 检查文件权限: 确保本地的 ~/.ssh 目录和密钥文件以及远程服务器上的 ~/.ssh 目录和 authorized_keys 文件的权限设置正确(通常是 .ssh700,私钥 600,公钥和 authorized_keys600644,取决于具体需求,但 authorized_keys 至少要是所有者独写)。不正确的权限是 SSH Key 认证失败的常见原因。
  • 定期审计授权密钥: 定期检查远程服务器上 ~/.ssh/authorized_keys 文件中的公钥列表,移除不再需要的或来源不明的公钥,以防未经授权的访问。
  • 备份密钥: 虽然私钥非常重要,但不应将其随意复制。如果需要备份,请将其保存在加密的存储设备上或使用安全的备份方案。

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

  • 仍然提示输入密码:
    • 检查远程服务器的 SSH 配置 (/etc/ssh/sshd_config) 是否允许公钥认证 (PubkeyAuthentication yes) 并且禁用了密码认证 (PasswordAuthentication no)。
    • 检查远程服务器上 ~/.ssh/authorized_keys 文件中是否正确包含了你的公钥内容,并且格式正确(每行一个公钥)。
    • 检查远程服务器上 ~/.ssh 目录和 authorized_keys 文件的权限是否正确。
    • 检查本地计算机上 ~/.ssh 目录和私钥文件的权限是否正确。
    • 如果你有多个密钥,检查 SSH 客户端是否正在尝试使用正确的私钥(查看命令行 -i 参数或 ~/.ssh/config)。
    • 如果设置了密码短语,检查是否正确输入了密码短语。
  • 权限被拒绝 (Permission denied): 通常是文件或目录权限设置不正确导致的。检查本地和远程的 .ssh 目录以及密钥文件的权限。
  • 代理转发失败 (Agent forwarding failed): 如果你在连接服务器后尝试从该服务器通过密钥连接到第三方服务(如 Git 仓库),需要确保启用了代理转发 (ssh -A user@host)。
  • 公钥格式错误: authorized_keys 文件中的每个公钥必须是完整的一行。不要有换行符,不要有多余的空格。

结论

通过本文的详细指南,你应该已经掌握了创建 SSH Key 密钥对、理解密钥文件、将公钥部署到远程服务器以及使用 SSH Key 进行安全便捷连接的全部流程。SSH Key 是现代远程访问和安全认证的重要组成部分,掌握它的使用将显著提升你的工作效率和系统安全性。

从现在开始,告别繁琐的密码,享受 SSH Key 带来的高效和安全吧!如果遇到问题,请仔细检查每一步骤和相关的权限设置,大多数问题都可以迎刃而解。


发表评论

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

滚动至顶部