零基础入门:使用 ssh-keygen
创建 SSH 密钥对的超详细指南
欢迎来到网络安全与远程连接的世界!如果你曾经需要连接到远程服务器、管理代码仓库(比如 GitHub、GitLab)或者进行其他需要身份验证的操作,你很可能听说过 SSH。SSH(Secure Shell)是一种加密的网络协议,它允许你在不安全的网络上安全地进行远程连接。
SSH 提供多种身份验证方式,其中最安全、最常用的一种就是基于密钥对的身份验证。与传统的密码不同,密钥对提供了一种无需在每次连接时输入密码的便利且安全的方式。而创建这个密钥对的核心工具,就是我们今天要详细介绍的命令:ssh-keygen
。
这篇指南将从零开始,手把手带你完成 SSH 密钥对的创建过程,解释每一个步骤、每一个提示符的含义,并深入探讨密钥对的工作原理和一些进阶用法。即使你从未接触过命令行,也能轻松掌握。
准备好了吗?让我们开始吧!
第一章:理解基础——什么是 SSH 密钥对?为什么使用它?
在深入学习 ssh-keygen
之前,我们先来理解几个基本概念。
1. 什么是 SSH?
SSH 的全称是 Secure Shell,意为“安全外壳”。它是一种网络协议,用于在不安全的网络中(比如互联网)提供安全的远程登录和其他安全网络服务。最常见的用途是远程连接到 Linux 或 Unix 服务器,执行命令、传输文件等。
2. SSH 身份验证的两种主要方式:
-
密码认证 (Password Authentication): 这是我们最熟悉的方式。你在连接时输入用户名和密码,服务器验证密码正确后允许你登录。这种方式简单直观,但存在一些缺点:
- 安全性较低: 密码容易被暴力破解、字典攻击,或者在不安全的连接中被截获(尽管 SSH 本身是加密的,但如果你的机器或服务器被恶意软件感染,密码可能泄露)。
- 不方便: 每次连接都需要手动输入密码,对于频繁连接或自动化脚本来说非常麻烦。
- 弱密码问题: 用户倾向于使用简单、易记的密码,进一步降低了安全性。
-
公钥认证 (Public Key Authentication): 这是一种基于非对称加密(也称为公钥加密)的身份验证方式。它使用一对数学上关联的密钥:一个私钥 (Private Key) 和一个公钥 (Public Key)。
- 私钥: 就像你的个人印章或银行卡的密码,绝对不能泄露给任何人。它保存在你的本地计算机上,通常会用一个密码短语 (Passphrase) 来加密保护,增加安全性。
- 公钥: 就像你的门锁的型号或你的银行卡号(但不是密码),可以公开分享给任何人。你会把公钥放到你需要连接的远程服务器上。
3. 公钥认证的工作原理(简单来说):
当你尝试使用公钥认证连接到远程服务器时,大致过程是这样的:
- 你的 SSH 客户端(在你本地)向服务器表明你想使用密钥对进行认证。
- 服务器收到请求后,会检查你提供的用户名对应的
authorized_keys
文件中是否有你的公钥。 - 如果找到了你的公钥,服务器会生成一个随机数据,并使用你的公钥对这个数据进行加密(或者进行一个挑战-响应过程)。
- 服务器将加密后的数据发送回你的客户端。
- 你的客户端收到加密数据后,使用你本地保存的私钥来解密(或响应挑战)。
- 客户端将解密后的数据(或响应结果)发回服务器。
- 服务器收到解密后的数据(或响应),与自己发送的原始数据(或预期的响应)进行比对。如果一致,服务器就知道你确实拥有与服务器上公钥匹配的私钥,从而允许你登录。
整个过程中,你的私钥从未离开过你的计算机,也没有在网络上传输。这就像你用一把独特的钥匙打开了一个只有你的钥匙能打开的锁(公钥),服务器通过锁打开的方式确认了你的身份。
4. 为什么使用公钥认证?
- 更高的安全性: 与密码不同,密钥对是基于复杂的数学算法生成的,几乎不可能被暴力破解。即使有人截获了网络通信,也无法仅凭公钥推算出私钥。
- 更强的防范: 可以有效抵御暴力破解和字典攻击。
- 便利性: 一旦设置好,通常无需输入密码(如果你使用了 ssh-agent 并输入了一次密码短语),极大地提升了连接效率,尤其适合自动化脚本、版本控制操作等。
- 灵活管理: 你可以为不同的服务或不同的服务器使用不同的密钥对。
5. ssh-keygen
的作用:
ssh-keygen
就是我们用来生成这对至关重要的私钥和公钥的命令行工具。它通常是 SSH 客户端软件的一部分,在大多数操作系统(Linux, macOS, Windows 10/11 及更高版本自带的 OpenSSH)中都可以直接使用。
第二章:准备工作——打开你的终端
在开始使用 ssh-keygen
之前,你需要打开一个命令行终端或 shell 窗口。
- 在 Linux 系统中: 打开“终端”应用程序(通常在应用程序菜单中的“附件”或“系统工具”分类下)。
- 在 macOS 系统中: 打开“终端”应用程序(位于“应用程序”->“实用工具”)。
- 在 Windows 系统中:
- 如果你使用 Windows 10 或 11,系统可能已经内置了 OpenSSH 客户端。你可以通过搜索框输入“cmd”打开“命令提示符”,或者输入“powershell”打开“Windows PowerShell”。推荐使用 PowerShell 或 Windows Terminal,它们通常对 SSH 支持更好。
- 如果你使用的是旧版 Windows 或者需要更完整的 Linux 环境,可以考虑安装 Git for Windows(它包含 Git Bash,一个带有 SSH 工具的模拟 Linux 环境)或启用适用于 Linux 的 Windows 子系统 (WSL)。对于本指南,使用自带的 PowerShell 或命令提示符通常就足够了。
打开终端后,你会看到一个命令行提示符,等待你输入命令。
第三章:最简单的开始——执行 ssh-keygen
命令
创建 SSH 密钥对最简单的方式,就是在终端中直接输入 ssh-keygen
并按下回车。
bash
ssh-keygen
执行这个命令后,ssh-keygen
会开始引导你完成密钥创建过程。你会看到一系列的提示信息。
步骤详解:
-
提示信息:
Generating public/private rsa key pair.
这一行告诉你,工具正在开始生成一对公钥和私钥。默认情况下,ssh-keygen
会使用 RSA 算法来生成密钥对。我们稍后会讨论其他算法和如何指定它们。 -
提示保存密钥文件位置:
Enter file in which to save the key (/home/your_username/.ssh/id_rsa):
或者在 Windows 上可能是:
Enter file in which to save the key (C:\Users\YourUsername/.ssh/id_rsa):
这一步是询问你想把生成的密钥文件保存在哪里。括号里显示的是默认的保存路径和文件名:
*/home/your_username/
(Linux/macOS) 或C:\Users\YourUsername\
(Windows) 是你的用户主目录。~
符号在终端中通常代表你的用户主目录。
*.ssh/
是在你用户主目录下创建一个隐藏的目录。SSH 客户端和服务器默认在这个目录下查找密钥文件和配置文件。点号开头的目录在大多数系统中是隐藏的。
*id_rsa
是私钥文件的默认文件名,表示这是一个使用 RSA 算法生成的身份密钥 (identity key)。建议: 对于你的第一对SSH密钥,强烈建议直接接受默认路径和文件名。这样 SSH 客户端在连接时会自动找到它们,无需额外的配置。所以,你只需要直接按下回车键即可。
如果你不输入任何内容直接回车,
ssh-keygen
会使用默认路径和文件名。Enter file in which to save the key (/home/your_username/.ssh/id_rsa): <-- 这里直接按回车
如果
~/.ssh/
目录不存在,ssh-keygen
会自动为你创建它。如果该目录下已经存在同名的文件 (id_rsa
和id_rsa.pub
),它会询问你是否要覆盖它们。注意: 覆盖现有的密钥意味着你将失去对所有使用旧密钥进行身份验证的服务的访问权限,除非你更新那些服务上的公钥。通常情况下,不建议轻易覆盖现有的默认密钥。如果你需要生成新的密钥用于特定目的,最好使用-f
参数指定不同的文件名(我们稍后会讲到)。 -
提示输入密码短语 (Passphrase):
Enter passphrase (empty for no passphrase):
这一步非常重要。它询问你是否要为你的私钥设置一个密码短语。
- 什么是密码短语? 密码短语类似于一个密码,但它可以包含空格和标点符号,因此可以更长、更复杂,安全性更高。
- 为什么需要密码短语? 密码短语为你的私钥提供了额外的安全层。即使你的私钥文件不小心泄露了,攻击者也无法在不知道密码短语的情况下使用它。这大大降低了私钥被盗用带来的风险。
- 输入密码短语时的注意事项: 当你输入密码短语时,出于安全考虑,终端上不会显示任何字符(甚至不会显示星号)。你只需要盲打即可。
- 是否可以不设置密码短语? 你可以不设置密码短语,直接按下回车键。这被称为创建一个无密码短语的密钥。虽然这在使用时最方便(连接时无需输入任何内容),但安全性最低。如果你的私钥文件被获取,任何人都可以直接使用它。除非你有非常明确的理由(比如用于自动化脚本,且能确保私钥文件的绝对安全),强烈建议你为私钥设置一个强密码短语。
建议: 输入一个足够长、包含大小写字母、数字和特殊符号的强密码短语。记住这个密码短语!
Enter passphrase (empty for no passphrase): <-- 在这里输入你的密码短语,不会显示
-
再次确认密码短语:
Enter same passphrase again:
这是为了确保你没有输错密码短语。再次输入你刚才设置的密码短语,同样不会显示任何字符。
Enter same passphrase again: <-- 再次输入相同的密码短语,不会显示
-
密钥生成成功信息:
如果你两次输入的密码短语一致,
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:........................................... user@hostname
The key's randomart image is:
+--[RSA 3072]--+
| .+*. |
| . o.= |
| . o.= . |
| . . B + o |
| . o * S o |
| . + O o o |
| . = O B + |
|+ o * * . |
|Eo.=+=+= . |
+----[SHA256]----+恭喜!你已经成功生成了你的 SSH 密钥对。
Your identification has been saved in ...id_rsa
: 这是你的私钥文件路径。Your public key has been saved in ...id_rsa.pub
: 这是你的公钥文件路径。.pub
后缀是 public 的缩写。The key fingerprint is:
: 这是你的公钥的指纹。指纹是公钥经过哈希计算后得到的一个短字符串,可以用来快速、方便地标识和验证公钥,而无需查看完整的公钥内容。当你第一次连接到某个服务器并使用密钥认证时,服务器可能会显示它的公钥指纹,你可以与你知道的正确指纹进行比对,以防止中间人攻击。The key's randomart image is:
: 这是一个随机生成的 ASCII 艺术图像,也是基于公钥指纹生成的。它可以作为一种视觉辅助,帮助你快速辨认一个公钥是否是你预期的那个(通过比对图像)。不同的公钥会有截然不同的图像。
第四章:查看和理解生成的密钥文件
密钥对生成后,它们被保存在你用户主目录下的 .ssh/
目录中。让我们来看看这些文件。
1. 查看文件列表:
在终端中,你可以使用以下命令查看 .ssh/
目录下的文件:
-
在 Linux/macOS 中:
bash
ls -la ~/.ssh/
ls
命令用于列出文件,-l
显示详细信息(包括权限),-a
显示隐藏文件(包括点号开头的目录),~/.ssh/
是目录路径。 -
在 Windows PowerShell 中:
powershell
Get-ChildItem ~/.ssh/ -Force
Get-ChildItem
(别名ls
) 用于列出文件,-Force
参数用于显示隐藏文件,~/.ssh/
是目录路径。 -
在 Windows 命令提示符 (cmd) 中:
cmd
dir %USERPROFILE%\.ssh
dir
用于列出文件,%USERPROFILE%
是环境变量,代表用户主目录。注意dir
默认会显示隐藏文件,但可能需要额外的参数才能显示.ssh
目录本身(如果它恰好是该目录下唯一的文件/目录)。更可靠的方式可能还是切换到 PowerShell 或使用cd %USERPROFILE%
然后dir .ssh
。
执行命令后,你应该会看到类似下面的输出(具体文件、权限、用户和日期会因你的系统和创建时间而异):
total 8
drwx------ 2 user group 4096 Jan 1 10:00 .
drwxr-xr-x 45 user group 4096 Jan 1 09:50 ..
-rw------- 1 user group 2610 Jan 1 10:00 id_rsa
-rw-r--r-- 1 user group 575 Jan 1 10:00 id_rsa.pub
这里有几个重要的点:
.
和..
是特殊目录,分别代表当前目录和上级目录。id_rsa
是你的私钥文件。id_rsa.pub
是你的公钥文件。
2. 理解文件权限:
注意 id_rsa
文件前面的权限:-rw-------
。
* 第一个 -
表示这是一个普通文件。
* rw-
表示文件所有者(user
)有读(r)和写(w)的权限。
* 接下来的 ---
表示文件所有者所属的组(group
)没有任何权限。
* 最后的 ---
表示其他任何人(other)也没有任何权限。
这意味着只有文件的所有者才能读取和修改私钥文件。这是至关重要的安全设置!SSH 客户端在进行身份验证时会严格检查私钥文件的权限。如果私钥文件的权限设置得太开放(例如,其他用户也有读权限),SSH 客户端会拒绝使用它,并可能报错 Permissions too open
,因为它认为你的私钥不安全。
而 id_rsa.pub
文件的权限是 -rw-r--r--
。
* 文件所有者有读写权限。
* 文件所有者所属的组有读权限。
* 其他任何人也有读权限。
这是可以接受的,因为公钥本来就是设计来公开分享的。
如果你发现 id_rsa
的权限不是 600
(即 -rw-------
),可以使用 chmod
命令来修正它:
bash
chmod 600 ~/.ssh/id_rsa
chmod
是改变文件权限的命令,600
是权限的代码表示,~/.ssh/id_rsa
是目标文件。
3. 查看公钥文件内容:
公钥文件 (id_rsa.pub
) 的内容是你可以公开分享的。你可以使用 cat
命令查看它的内容:
-
在 Linux/macOS 中:
bash
cat ~/.ssh/id_rsa.pub -
在 Windows PowerShell 中:
powershell
Get-Content ~/.ssh/id_rsa.pub
或者简单别名:
powershell
cat ~/.ssh/id_rsa.pub -
在 Windows 命令提示符 (cmd) 中:
cmd
type %USERPROFILE%\.ssh\id_rsa.pub
你会看到类似这样的输出:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD...长串字符...AQAB user@hostname
公钥文件的格式通常是:[密钥类型] [密钥本身的base64编码字符串] [可选的注释]
。
* ssh-rsa
: 表示密钥类型是 RSA。
* AAAAB3NzaC1yc2EAAAA...
: 这是公钥的实际内容,经过 Base64 编码后的字符串。当你需要将公钥上传到服务器、GitHub、GitLab 或其他服务时,复制粘贴的就是这一整行内容。
* user@hostname
: 这是你在生成密钥时或者系统自动添加的一个注释,通常用来标识这个密钥是哪个用户在哪台机器上生成的。如果你在生成时使用了 -C
参数(稍后介绍),这里的注释就是你指定的内容。
4. 关于私钥文件内容:
私钥文件 (id_rsa
) 的内容是高度敏感的,你不应该随意查看或分享它。它的格式与公钥不同,是更复杂的结构,通常包含一些加密头信息(如果设置了密码短语)以及私钥的数学参数。它不是为人类阅读设计的。
记住:永远不要将你的私钥文件 (id_rsa
) 或其内容分享给任何人!
第五章:使用生成的密钥对进行身份验证
创建了密钥对后,下一步就是如何使用它来连接到远程服务。核心思想是:将你的公钥放到你想要连接的服务或服务器上。
1. 将公钥添加到远程服务器:
假设你要连接到一个 Linux 服务器(用户名为 remote_user
,服务器地址为 remote_server_ip
)。你需要将你的公钥添加到该服务器上 remote_user
的家目录下的 ~/.ssh/authorized_keys
文件中。这个文件列出了允许使用公钥认证登录的用户公钥。
最简单、推荐的方法:使用 ssh-copy-id
命令。
ssh-copy-id
是一个非常方便的工具,它会自动将你的公钥添加到远程服务器的 ~/.ssh/authorized_keys
文件中。如果远程服务器的 .ssh
目录或 authorized_keys
文件不存在,它也会帮你创建并设置正确的权限。
bash
ssh-copy-id remote_user@remote_server_ip
执行这个命令后:
1. 它会尝试使用密码认证连接到远程服务器。你需要输入 remote_user
在 remote_server_ip
上的密码。
2. 如果密码正确,它会将你本地的默认公钥文件 (~/.ssh/id_rsa.pub
或其他默认识别的公钥) 的内容追加到远程服务器上 ~/.ssh/authorized_keys
文件的末尾。
3. 完成后,它会告诉你添加成功。
现在,你可以尝试使用密钥对连接了。
手动添加公钥(了解原理):
如果你无法使用 ssh-copy-id
(例如,本地系统没有这个命令,或者有特殊需求),你可以手动完成这个过程:
- 将你的公钥内容复制到剪贴板(参照前面查看公钥文件内容的命令)。
- 使用密码认证登录到远程服务器:
bash
ssh remote_user@remote_server_ip
# 输入远程服务器上 remote_user 的密码 - 在远程服务器上,确保
~/.ssh
目录存在并具有正确权限(如果不存在则创建):
bash
mkdir -p ~/.ssh
chmod 700 ~/.ssh
mkdir -p
创建目录(如果已存在则不报错)。chmod 700
设置目录权限,确保只有用户自己有读、写、执行权限。 -
将你的公钥内容追加到
~/.ssh/authorized_keys
文件中:
bash
echo "粘贴你本地的公钥内容在这里" >> ~/.ssh/authorized_keys
注意:粘贴时要包含ssh-rsa AAAAB3Nz... comment
完整的一行。
或者,更安全的方式是先在本地复制公钥,然后使用cat
结合 SSH 命令一次性完成:
bash
cat ~/.ssh/id_rsa.pub | ssh remote_user@remote_server_ip 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'
这个命令的含义是:读取本地的公钥文件内容 (cat ~/.ssh/id_rsa.pub
),通过管道 (|
) 将内容传递给ssh
命令,SSH 连接到远程服务器并执行后面的命令字符串。命令字符串中:mkdir -p ~/.ssh
创建目录,cat >> ~/.ssh/authorized_keys
将接收到的内容追加到authorized_keys
文件,chmod 600 ~/.ssh/authorized_keys
设置authorized_keys
文件的权限(只有所有者可读写)。 -
确保
authorized_keys
文件有正确权限:
bash
chmod 600 ~/.ssh/authorized_keys
chmod 600
设置文件权限,确保只有文件所有者有读和写权限。
完成上述步骤后,你的公钥就成功添加到远程服务器的授权列表中了。
2. 使用密钥对连接:
现在,尝试再次连接到远程服务器:
bash
ssh remote_user@remote_server_ip
如果一切设置正确:
-
如果你设置了密码短语: SSH 客户端会找到你的私钥 (
~/.ssh/id_rsa
),并提示你输入私钥的密码短语:
Enter passphrase for key '/home/your_username/.ssh/id_rsa':
输入你创建密钥时设置的密码短语(同样不会显示字符)并回车。如果密码短语正确,你就可以成功登录到远程服务器了。 -
如果你没有设置密码短语: SSH 客户端会直接使用私钥进行认证,无需任何输入,直接连接成功。
第六章:ssh-keygen
的进阶选项
ssh-keygen
命令提供了很多选项,可以让你更灵活地控制密钥的生成过程。以下是一些常用的进阶选项:
1. 指定密钥类型 (-t
)
默认情况下,ssh-keygen
生成 RSA 密钥。但你也可以指定其他算法。目前推荐使用的算法是 Ed25519。
- RSA: 老牌算法,广泛支持。默认密钥长度通常是 2048 或 3072 位。你可以使用
-b
参数指定长度。 - Ed25519: 一种较新的算法,基于椭圆曲线密码学。通常比 RSA 在相同安全强度下更快、密钥文件更小。推荐使用 Ed25519 算法生成新密钥。
要生成 Ed25519 密钥,使用 -t ed25519
选项:
bash
ssh-keygen -t ed25519
接下来的步骤与生成 RSA 密钥类似:询问保存位置、设置密码短语。默认文件名为 id_ed25519
。
2. 指定密钥长度 (-b
)
这个选项主要用于 RSA 密钥。Ed25519 算法是固定长度的,不需要 -b
参数。
默认的 RSA 密钥长度通常是 2048 位(2048
)或 3072 位(3072
)。更长的密钥提供更高的安全性,但生成和使用时可能会稍微慢一点。对于大多数用途,2048 位已经足够安全,但 4096 位(4096
)提供了更高的安全余量,也常被推荐。
要生成一个 4096 位的 RSA 密钥:
bash
ssh-keygen -t rsa -b 4096
3. 指定密钥文件路径 (-f
)
如果你不想使用默认的 id_rsa
或 id_ed25519
文件名,或者想为不同的服务生成不同的密钥对,可以使用 -f
选项指定文件路径和名称。
例如,为 GitHub 生成一个专门的 Ed25519 密钥:
bash
ssh-keygen -t ed25519 -f ~/.ssh/github_ed25519
这将生成 ~/.ssh/github_ed25519
(私钥) 和 ~/.ssh/github_ed25519.pub
(公钥)。
当你连接到需要这个特定密钥的服务时,你可能需要在 SSH 配置文件 (~/.ssh/config
) 中进行配置,或者在连接时使用 -i
参数指定私钥文件:
bash
ssh -i ~/.ssh/github_ed25519 [email protected]
4. 添加注释 (-C
)
你可以在生成密钥时使用 -C
选项为公钥添加一个注释。这个注释会附加在公钥文件的末尾,通常用来标识密钥的用途或所有者。默认注释通常是 user@hostname
。
bash
ssh-keygen -t ed25519 -C "My personal key for remote servers"
或者结合 -f
:
bash
ssh-keygen -t rsa -b 4096 -f ~/.ssh/work_rsa -C "Work key on my laptop"
5. 创建无密码短语的密钥 (-N
)
前面提到,可以不设置密码短语,但这不安全。如果你确实需要创建一个无密码短语的密钥(例如,用于完全自动化的脚本),可以使用 -N ""
(注意 -N
后面的两个双引号表示空密码短语)。
bash
ssh-keygen -t ed25519 -f ~/.ssh/automation_key -N "" -C "Key for automation script (NO PASSPHRASE!)"
再次强调:这样做会降低安全性,请务必小心!
6. 改变现有密钥的密码短语 (-p
)
如果你想为你已经生成的密钥修改密码短语,可以使用 -p
选项:
bash
ssh-keygen -p -f ~/.ssh/id_rsa
它会首先要求你输入旧的密码短语(如果存在),然后要求你输入并确认新的密码短语。
7. 查看公钥 (-y
)
如果你只有私钥文件,但丢失了对应的公钥文件 (.pub
文件),可以使用 -y
选项从私钥中提取并显示公钥内容:
bash
ssh-keygen -y -f ~/.ssh/id_rsa
这会直接在终端中打印出公钥内容,你可以将其复制并保存为 .pub
文件。
8. 强制覆盖现有文件 (-f
与确认提示)
如果你指定了 -f
选项到一个已经存在的路径,ssh-keygen
会询问你是否覆盖。如果你想脚本化生成密钥并强制覆盖,可以结合其他工具,但一般交互式使用时直接响应提示即可。
第七章:最佳实践和安全提示
生成和使用 SSH 密钥对涉及一些重要的安全实践,请务必注意:
-
保护好你的私钥文件:
- 绝不分享: 永远不要把你的私钥文件 (
id_rsa
,id_ed25519
等) 或其内容给任何人。 - 正确权限: 确保私钥文件的权限是
600
(只有所有者可读写)。~/.ssh
目录的权限应该是700
(只有所有者有读写执行权限)。SSH 客户端会检查这些权限。 - 物理安全: 确保你的计算机安全,不被未经授权的人物理访问。
- 绝不分享: 永远不要把你的私钥文件 (
-
使用强密码短语: 为你的私钥设置一个强大、独特且容易记住(对你而言)的密码短语。一个好的密码短语比一个复杂的密码更安全,因为它可以更长并包含更多字符类型。避免使用容易猜测的词语或个人信息。
-
使用
ssh-agent
: 如果你设置了密码短语,每次连接时都需要输入,这可能会有点麻烦。ssh-agent
是一个后台运行的程序,它可以帮你管理私钥。你只需要在启动ssh-agent
后将私钥添加到代理中(使用ssh-add
命令),并输入一次密码短语。之后在你的用户会话期间,所有需要使用该私钥的 SSH 连接都会自动通过ssh-agent
进行认证,无需再次输入密码短语。这既方便又安全,因为私钥本身仍然是被密码短语加密保护的。 -
定期检查
authorized_keys
文件: 在你的远程服务器上,定期检查~/.ssh/authorized_keys
文件,确保里面只有你添加的、你认识的公钥。删除任何不明或不再需要的公钥。 -
考虑使用不同的密钥对: 对于不同的重要服务(例如,工作服务器、个人服务器、GitHub、某个重要供应商),可以考虑使用不同的密钥对。这样即使其中一个密钥对不慎泄露,也不会影响到其他服务的安全。使用
-f
参数和有意义的文件名来管理它们。 -
优先使用 Ed25519 密钥: 如果你连接的服务和客户端都支持,优先生成和使用 Ed25519 密钥,因为它通常更高效且安全。
-
备份你的密钥对: 如果你的本地计算机损坏或丢失,而你没有备份你的密钥对,你将无法再使用这个密钥对连接到任何服务。请妥善备份你的私钥(以及公钥)到安全可靠的地方(例如,加密的云存储或外部硬盘)。备份私钥文件时,务必确保它有强大的密码短语保护。
第八章:常见问题与故障排除
-
创建密钥时提示
Enter file in which to save the key...
默认路径下已有文件并询问是否覆盖,我该怎么办?- 如果你确定这是你旧的、不再需要的密钥,并且你已经备份好或者知道后果,可以输入
y
并回车覆盖。 - 如果你不确定或者想保留旧密钥,输入
n
并回车,然后使用-f
选项指定一个新的文件路径和名称来生成密钥(例如:ssh-keygen -t ed25519 -f ~/.ssh/new_id_ed25519
)。
- 如果你确定这是你旧的、不再需要的密钥,并且你已经备份好或者知道后果,可以输入
-
连接服务器时提示
Permissions too open
或Bad permissions
?- 这几乎总是因为你的私钥文件 (
~/.ssh/id_rsa
或其他私钥文件) 或~/.ssh
目录的权限设置不正确。请使用chmod
命令修正权限:
bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa # 修正你的私钥文件权限 - 同样,检查远程服务器上
~/.ssh
目录和~/.ssh/authorized_keys
文件的权限:
bash
# 在远程服务器上执行
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
- 这几乎总是因为你的私钥文件 (
-
连接服务器时总是要求输入密码,而不是密码短语或直接连接?
- 检查你的公钥是否已经正确添加到远程服务器的
~/.ssh/authorized_keys
文件中。你可以手动登录服务器并查看该文件的内容,确保你的公钥(一整行ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD... comment
)确实在里面。 - 检查远程服务器的 SSH 配置 (
/etc/ssh/sshd_config
) 是否允许公钥认证 (PubkeyAuthentication yes
)。通常默认是开启的,但有时会被禁用。修改配置后需要重启 SSH 服务。 - 检查远程服务器上
~/.ssh
目录和~/.ssh/authorized_keys
文件的权限是否正确(参照上一点)。 - 确保你的 SSH 客户端在连接时能够找到正确的私钥文件。默认是查找
~/.ssh/id_rsa
或~/.ssh/id_ed25519
。如果你使用了不同的文件名,需要使用-i
参数指定,或者在~/.ssh/config
文件中进行配置。
- 检查你的公钥是否已经正确添加到远程服务器的
-
连接服务器时提示
Enter passphrase for key ...
但输入密码短语后还是无法连接?- 确认你输入的密码短语是否正确。记住,输入时终端不会显示任何字符。
- 尝试使用
ssh-add -D
清除ssh-agent
中可能存在的旧密钥,然后使用ssh-add ~/.ssh/your_private_key
重新添加你的密钥并输入密码短语。 - 如果怀疑密码短语输入错误,可以使用
ssh-keygen -p -f ~/.ssh/your_private_key
尝试修改密码短语(这会要求你输入旧密码短语)。
-
我生成了密钥,但连接 GitHub/GitLab 等服务时还是提示输入密码?
- 请确保你已经将你的公钥(
id_rsa.pub
或其他.pub
文件的内容)添加到了你的 GitHub/GitLab 账户设置的 SSH Keys 页面中。通常在“Settings” -> “SSH and GPG keys” (GitHub) 或 “Settings” -> “SSH Keys” (GitLab) 下。 - 尝试使用
ssh -T [email protected]
(GitHub) 或ssh -T [email protected]
(GitLab) 命令测试连接,它会告诉你是否成功通过 SSH 认证。
- 请确保你已经将你的公钥(
结论
通过本篇指南,你应该已经掌握了使用 ssh-keygen
命令创建 SSH 密钥对的基本方法和常用进阶选项。你学会了如何生成默认的 RSA 密钥,如何选择更安全的 Ed25519 算法,如何设置密码短语来保护你的私钥,以及如何将公钥部署到远程服务器以便进行无密码(或仅输入密码短语)的身份验证。
SSH 密钥对是安全远程连接的基石,掌握其创建和使用方法对于开发者、系统管理员以及任何需要频繁安全访问远程资源的用户来说都至关重要。
实践是最好的老师。现在,就动手尝试在你自己的机器上生成一个密钥对,并将你的公钥添加到你可以控制的服务器或代码托管平台账户上,亲身体验一下基于密钥认证的便利与安全吧!
祝你使用 SSH 愉快!