告别繁琐密码,拥抱 SSH Key 的高效与安全:详细创建指南
在日常的服务器管理、代码版本控制(如 Git)以及各种需要远程安全连接的场景中,SSH(Secure Shell)协议扮演着至关重要的角色。它提供了一种加密的方式来安全地访问远程计算机。传统的 SSH 认证方式是基于密码的,但这存在一些固有的问题:密码容易被猜测或通过暴力破解攻击获取,而且频繁输入复杂密码既不方便也不安全。
SSH 密钥(SSH Key)提供了一种更安全、更便捷的认证方式。它基于非对称加密原理,使用一对密钥:一个私钥(Private Key)和一个公钥(Public Key)。你可以将公钥部署到你需要访问的远程服务器上,而私钥则保留在你的本地计算机上。当你尝试连接时,SSH 客户端使用你的私钥向服务器证明你的身份,服务器则使用对应的公钥进行验证。这个过程是加密的,且无需传输私钥,极大地提高了安全性。
使用 SSH Key 的主要优势包括:
- 更高的安全性: 密钥对通常比密码更长、更复杂,难以猜测或暴力破解。私钥永不离开你的本地设备,降低了泄露风险。
- 更便捷的连接: 设置完成后,连接远程服务器通常无需再次输入密码(除非你为私钥设置了密码短语)。这对于自动化脚本和频繁连接非常有用。
- 更灵活的权限管理: 可以为不同的用户或用途生成不同的密钥对,并将其部署到不同的服务器上,实现精细化的权限控制。
既然 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 算法,除非你需要连接的旧系统不支持它。- 还有其他类型如
dsa
和ecdsa
,但通常不推荐使用(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_ed25519
或 id_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_ed25519
或id_rsa
):这是你的私钥文件。它包含用于解密的私密信息,是认证的核心。绝对不要分享或泄露这个文件。在 Linux/macOS 系统中,它的权限通常会被自动设置为600
(只有所有者有读写权限),这是为了安全。如果你手动复制或移动了私钥文件,请确保它的权限是600
。id_[key_type].pub
(例如id_ed25519.pub
或id_rsa.pub
):这是你的公钥文件。它包含用于加密和验证的公开信息。你可以将这个文件的内容复制到任何你需要使用 SSH Key 认证的远程服务器上。这个文件是设计为可以公开的。在 Linux/macOS 系统中,它的权限通常是644
(所有者可读写,其他人只读)。
默认位置 ~/.ssh/
:
在类 Unix 系统(Linux、macOS)中,~
代表当前用户的主目录,所以 ~/.ssh/
指的是你用户主目录下的 .ssh
隐藏文件夹。SSH 客户端在连接时,会默认首先查找这个目录下的 id_rsa
、id_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_hostuser
:远程服务器上的用户名。remote_host
:远程服务器的 IP 地址或域名。-i path/to/your/private_key.pub
:指定要复制的公钥文件路径(如果使用默认公钥,则不需要-i
参数)。
-
示例: 将默认公钥复制到 IP 地址为
192.168.1.100
的服务器上的myuser
用户:bash
ssh-copy-id [email protected] -
过程:
- 运行命令后,如果这是你第一次连接该服务器,会询问你是否信任该主机(显示服务器的指纹)。输入
yes
并按 Enter。 - 接着,系统会提示你输入远程服务器上
myuser
账户的密码。输入密码并按 Enter。 ssh-copy-id
会登录到远程服务器,创建~/.ssh
目录(如果不存在),设置权限,然后将你的公钥内容追加到~/.ssh/authorized_keys
文件中(如果文件不存在则创建),并设置文件权限。- 完成后,命令会报告已添加的密钥数量。
- 运行命令后,如果这是你第一次连接该服务器,会询问你是否信任该主机(显示服务器的指纹)。输入
方法 2:手动复制公钥内容
如果 ssh-copy-id
工具不可用,或者你想更精细地控制过程,可以手动完成。
- 步骤:
- 在本地计算机上,获取公钥文件的内容: 使用文本编辑器打开你的公钥文件 (
~/.ssh/id_ed25519.pub
或~/.ssh/id_rsa.pub
),或者使用命令行工具显示其内容。
bash
cat ~/.ssh/id_ed25519.pub
复制终端或编辑器中显示的完整公钥内容。它看起来像一行很长的文本,以ssh-ed25519
或ssh-rsa
开头,以你创建时指定的注释结尾。 - 使用密码连接到远程服务器: 使用 SSH 命令连接到目标服务器,此时你需要输入密码登录。
bash
ssh user@remote_host - 在远程服务器上,创建或编辑
~/.ssh/authorized_keys
文件:- 首先,进入你的用户主目录:
cd ~
- 创建
.ssh
目录(如果不存在):mkdir ~/.ssh
- 设置
.ssh
目录的权限为700
:chmod 700 ~/.ssh
- 使用文本编辑器(如
nano
,vim
或vi
)打开或创建~/.ssh/authorized_keys
文件:nano ~/.ssh/authorized_keys
- 将你在本地复制的公钥内容粘贴到
authorized_keys
文件的末尾。每行一个公钥。 - 保存并关闭文件(在 nano 中是 Ctrl+X,然后输入 Y,再按 Enter)。
- 设置
authorized_keys
文件的权限为600
:chmod 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
文件的权限设置正确(通常是.ssh
为700
,私钥600
,公钥和authorized_keys
为600
或644
,取决于具体需求,但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
)。 - 如果设置了密码短语,检查是否正确输入了密码短语。
- 检查远程服务器的 SSH 配置 (
- 权限被拒绝 (Permission denied): 通常是文件或目录权限设置不正确导致的。检查本地和远程的
.ssh
目录以及密钥文件的权限。 - 代理转发失败 (Agent forwarding failed): 如果你在连接服务器后尝试从该服务器通过密钥连接到第三方服务(如 Git 仓库),需要确保启用了代理转发 (
ssh -A user@host
)。 - 公钥格式错误:
authorized_keys
文件中的每个公钥必须是完整的一行。不要有换行符,不要有多余的空格。
结论
通过本文的详细指南,你应该已经掌握了创建 SSH Key 密钥对、理解密钥文件、将公钥部署到远程服务器以及使用 SSH Key 进行安全便捷连接的全部流程。SSH Key 是现代远程访问和安全认证的重要组成部分,掌握它的使用将显著提升你的工作效率和系统安全性。
从现在开始,告别繁琐的密码,享受 SSH Key 带来的高效和安全吧!如果遇到问题,请仔细检查每一步骤和相关的权限设置,大多数问题都可以迎刃而解。