零基础必看!SSH Keygen生成RSA密钥指南


零基础必看!SSH Keygen 生成 RSA 密钥指南

在当今的数字世界中,安全地访问远程服务器和设备至关重要。SSH(Secure Shell)协议是实现这一目标的基础技术之一。它通过加密的网络连接,允许你安全地登录到远程系统并执行命令。而 SSH 密钥,尤其是 RSA 密钥,是 SSH 安全性的核心。本文将带你一步步了解如何使用 ssh-keygen 命令生成 RSA 密钥对,即使你没有任何相关经验也能轻松上手。

1. 什么是 SSH?为什么我们需要 SSH 密钥?

在深入了解如何生成密钥之前,让我们先花点时间理解 SSH 的基本概念以及密钥的重要性。

1.1. SSH:安全外壳

SSH 是一种网络协议,用于在不安全的网络上安全地访问远程计算机。想象一下,你需要从家里连接到公司的服务器来处理一些工作。如果你直接通过传统的、未加密的方式(如 Telnet)连接,你的用户名、密码以及所有传输的数据都可能被网络上的恶意用户截获。这就像在公共场合大声喊出你的银行账户密码一样危险。

SSH 解决了这个问题。它通过以下方式提供安全连接:

  • 加密: SSH 使用强大的加密算法对客户端和服务器之间的所有通信进行加密。这意味着即使有人截获了数据,他们也无法理解其内容,除非他们拥有解密密钥。
  • 身份验证: SSH 提供了多种身份验证方法,确保只有授权用户才能访问远程系统。最常见的是基于密码的身份验证和基于密钥的身份验证。
  • 完整性: SSH 可以检测数据是否在传输过程中被篡改。如果数据被修改,连接将被终止,以防止潜在的安全问题。

1.2. SSH 密钥:更安全的选择

虽然基于密码的身份验证很常见,但它存在一些固有的安全风险:

  • 弱密码: 许多用户倾向于使用容易记住的弱密码,这些密码很容易被暴力破解。
  • 密码重用: 在多个网站或服务上重复使用相同的密码是非常危险的。如果其中一个网站被入侵,你的其他账户也可能受到威胁。
  • 密码泄露: 即使你使用了强密码,也无法保证密码永远不会泄露。例如,服务器端的安全漏洞可能导致密码数据库被盗。

SSH 密钥提供了一种更安全的替代方案。SSH 密钥由一对密钥组成:

  • 私钥(Private Key): 这是你必须保密的文件。它就像你家的钥匙,绝对不能与任何人分享。私钥用于对你发送到服务器的数据进行签名,以证明你的身份。
  • 公钥(Public Key): 这是你可以安全地分享给任何人的文件。它就像你家门上的锁,任何人都可以用它来验证你是否拥有匹配的钥匙(私钥)。公钥放置在你要访问的远程服务器上。

使用 SSH 密钥进行身份验证的过程如下:

  1. 你尝试连接到远程服务器。
  2. 服务器向你发送一个随机的挑战(challenge)。
  3. 你的 SSH 客户端使用你的私钥对这个挑战进行签名。
  4. 你的 SSH 客户端将签名后的响应发送回服务器。
  5. 服务器使用你之前放置在其上的公钥来验证签名。如果签名有效,则证明你拥有匹配的私钥,服务器允许你登录。

由于私钥从未通过网络传输,因此即使有人截获了通信,他们也无法获得你的私钥。这使得基于密钥的身份验证比基于密码的身份验证更安全。

2. ssh-keygen:生成密钥的瑞士军刀

ssh-keygen 是一个命令行工具,用于生成、管理和转换 SSH 密钥。它是 OpenSSH 套件的一部分,通常预装在大多数 Linux、macOS 和 Unix-like 系统上。在 Windows 上,你可以使用 Git Bash 或 Windows Subsystem for Linux (WSL) 来访问 ssh-keygen

2.1. 基本语法

ssh-keygen 的基本语法如下:

bash
ssh-keygen [options]

[options] 部分是可选的,用于指定密钥的类型、长度、注释等。如果不指定任何选项,ssh-keygen 将使用默认值生成一对 RSA 密钥。

2.2. 常用选项

以下是一些 ssh-keygen 的常用选项:

  • -t <type>:指定密钥类型。常见的类型包括:
    • rsa:RSA 算法(最常用)。
    • dsa:DSA 算法(较旧,不推荐)。
    • ecdsa:椭圆曲线 DSA 算法(更安全,更高效)。
    • ed25519:Ed25519 算法(最安全,最推荐)。
  • -b <bits>:指定密钥长度(以位为单位)。对于 RSA 密钥,常见的长度包括 2048 位(默认)、3072 位和 4096 位。密钥越长,安全性越高,但生成和使用所需的时间也越长。
  • -f <filename>:指定密钥文件的名称。默认情况下,私钥存储在 ~/.ssh/id_rsa 中,公钥存储在 ~/.ssh/id_rsa.pub 中。
  • -C <comment>:添加注释到密钥文件中。注释可以是任何文本,通常用于标识密钥的用途或所有者。
  • -N <passphrase>:设置私钥的密码短语(passphrase)。密码短语用于加密私钥文件,提供额外的安全层。如果设置了密码短语,每次使用私钥时都需要输入它。
  • -P <passphrase>:旧版的设置密钥密码参数,现在推荐使用-N
  • -q: 静默模式,不显示过程中的信息,一般和其他参数一起使用

3. 生成 RSA 密钥对:一步步指南

现在,让我们开始生成 RSA 密钥对。

3.1. 打开终端

首先,打开你的终端(Terminal)应用程序。在 Linux 和 macOS 上,你可以在应用程序菜单中找到它。在 Windows 上,你可以使用 Git Bash 或 WSL。

3.2. 运行 ssh-keygen 命令

在终端中,输入以下命令:

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

让我们分解这个命令:

  • ssh-keygen:这是命令本身。
  • -t rsa:指定密钥类型为 RSA。
  • -b 4096:指定密钥长度为 4096 位。
  • -C "[email protected]":添加注释,这里使用你的电子邮件地址作为注释。

3.3. 选择密钥文件位置

运行命令后,ssh-keygen 将提示你选择密钥文件的保存位置。默认情况下,它会建议将私钥保存在 ~/.ssh/id_rsa 中,将公钥保存在 ~/.ssh/id_rsa.pub 中。

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

你可以直接按 Enter 键接受默认位置,或者输入自定义的文件路径。

3.4. 设置密码短语(可选,强烈推荐)

接下来,ssh-keygen 将提示你设置密码短语。

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

强烈建议你设置一个强密码短语。密码短语将加密你的私钥文件,即使有人获得了你的私钥文件,他们也无法在没有密码短语的情况下使用它。

输入密码短语后,再次输入以确认。如果你不想设置密码短语,可以直接按两次 Enter 键跳过。

3.5. 完成生成

ssh-keygen 将生成密钥对,并显示密钥的指纹和随机图。

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:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx [email protected]
The key's randomart image is:
+---[RSA 4096]----+
| . |
| + . |
| . B . |
| . = * . |
| . o S + |
| . . o . |
| . . . |
| . . |
| . . |
+----[SHA256]-----+

现在,你的 RSA 密钥对已经生成成功了!私钥存储在 ~/.ssh/id_rsa 中,公钥存储在 ~/.ssh/id_rsa.pub 中。

4. 查看和管理密钥

4.1. 查看公钥

你可以使用 cat 命令查看公钥的内容:

bash
cat ~/.ssh/id_rsa.pub

这将输出类似于以下内容的公钥:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC... [email protected]

4.2. 查看私钥(谨慎操作)

你可以使用 cat 命令查看私钥的内容,但请务必谨慎操作,不要将私钥泄露给任何人:

bash
cat ~/.ssh/id_rsa

再次强调,永远不要分享或泄露你的私钥。

4.3. 修改密码短语

如果你想修改私钥的密码短语,可以使用以下命令:

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

这将提示你输入旧密码短语,然后输入新密码短语两次。

4.4. 删除密钥

如果你不再需要某个密钥对,可以将其删除。删除密钥对时,请务必同时删除私钥和公钥文件:

bash
rm ~/.ssh/id_rsa ~/.ssh/id_rsa.pub

5. 将公钥部署到远程服务器

生成密钥对后,你需要将公钥部署到你要访问的远程服务器上。这样,服务器才能使用你的公钥来验证你的身份。

5.1. 使用 ssh-copy-id 命令(推荐)

ssh-copy-id 命令是 OpenSSH 提供的一个实用工具,用于将公钥复制到远程服务器的 ~/.ssh/authorized_keys 文件中。这是最简单、最推荐的方法。

bash
ssh-copy-id username@remote_host

username 替换为你在远程服务器上的用户名,将 remote_host 替换为远程服务器的 IP 地址或域名。

运行此命令后,你将被提示输入远程服务器上该用户的密码。输入密码后,ssh-copy-id 将自动将你的公钥添加到 ~/.ssh/authorized_keys 文件中。

5.2. 手动复制公钥

如果你的系统上没有 ssh-copy-id 命令,或者你想手动复制公钥,可以按照以下步骤操作:

  1. 复制公钥: 使用 cat 命令查看你的公钥,并将其复制到剪贴板。
  2. 连接到远程服务器: 使用 SSH 客户端(如 PuTTY 或 Terminal)连接到远程服务器。
  3. 创建 .ssh 目录(如果不存在): 在远程服务器上,使用以下命令创建 .ssh 目录(如果它不存在):

    bash
    mkdir -p ~/.ssh

    4. 编辑 authorized_keys 文件: 使用文本编辑器(如 nanovim)打开 ~/.ssh/authorized_keys 文件:

    bash
    nano ~/.ssh/authorized_keys

    5. 粘贴公钥: 将你之前复制的公钥粘贴到 authorized_keys 文件中。确保公钥单独占一行。
    6. 保存并关闭文件: 保存并关闭 authorized_keys 文件。
    7. 设置权限: 使用以下命令设置 .ssh 目录和 authorized_keys 文件的正确权限:

    bash
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys

5.3. 测试 SSH 连接

完成公钥部署后,你可以测试 SSH 连接是否正常工作:

bash
ssh username@remote_host

如果一切正常,你将直接登录到远程服务器,而无需输入密码(除非你设置了密码短语)。

6. 密钥生成的最佳实践和安全建议

  • 使用强密码短语: 始终为你的私钥设置一个强密码短语。密码短语应足够长且复杂,以防止暴力破解。
  • 定期更换密钥: 定期更换你的 SSH 密钥,以降低密钥泄露的风险。
  • 保护私钥: 将你的私钥保存在安全的地方,不要将其存储在不安全的位置,如公共云存储或电子邮件中。
  • 使用最小权限原则: 仅将公钥部署到你实际需要访问的服务器上。
  • 使用防火墙: 在你的服务器上配置防火墙,只允许来自受信任 IP 地址的 SSH 连接。
  • 监控日志: 定期检查 SSH 服务器的日志,以检测任何可疑活动。
  • 使用 SSH 代理(ssh-agent): 如果你经常使用 SSH 密钥连接到多个服务器,可以使用 SSH 代理来缓存你的密码短语,避免每次连接都输入密码短语。
  • 考虑使用 ed25519或者ecdsa:虽然本文主要讲的是RSA,但是随着技术发展,ed25519或者ecdsa具有更高的安全性和更快的速度,推荐使用。

7. 进阶应用

  • 多个密钥对: 你可以为不同的服务器或服务生成多个密钥对。这可以提高安全性,因为如果一个密钥对泄露,其他密钥对仍然是安全的。只需在生成密钥时使用不同的文件名即可。
  • SSH 配置文件: 你可以使用 SSH 配置文件 (~/.ssh/config) 来管理多个 SSH 连接的设置。例如,你可以为每个服务器指定不同的用户名、密钥文件、端口号等。
  • 密钥轮换: 定期更换密钥是一种很好的安全实践。你可以使用脚本或工具来自动化密钥轮换过程。
  • 双因素认证 (2FA): 对于更高级别的安全需求,你可以结合 SSH 密钥和双因素认证 (如 Google Authenticator) 来实现更强的身份验证。

密钥守护神

通过本文的详细指南,你已经掌握了使用 ssh-keygen 生成 RSA 密钥对的基本技能,并了解了如何安全地管理和使用 SSH 密钥。记住,SSH 密钥是保护你远程访问安全的重要工具,请务必遵循最佳实践和安全建议,守护好你的数字资产。 掌握这些知识将是你迈向更安全的数字世界的重要一步。

THE END