课程
每次连接远程服务器或 GitHub 仓库都要输入密码,是否已经厌倦了?
SSH 密钥正是您要找的方案。它是在访问远程系统时替代基于密码认证的一种安全且便捷的方式。与密码相比,SSH 密钥提供更强的安全性,因为几乎不可能通过暴力破解。
多年来,SSH 密钥已经成为专业环境中安全远程连接的标准。对于使用远程服务器、云服务或 Git 等版本控制系统的任何人来说,它都不可或缺。
在本文中,您将学习如何生成 SSH 密钥、将其添加到远程系统,并落实安全管理的最佳实践。
什么是 SSH 密钥?
SSH 密钥是一种加密凭据,可让您在无需输入密码的情况下安全访问远程系统。与其记忆包含数字、大写字母和特殊字符的复杂密码,不如创建一对密钥——一个公钥,一个私钥。
可以将公钥想象成一个可以自由分发给任意目标服务器的挂锁;而私钥就像打开这些挂锁的唯一钥匙。当您连接到远程系统时,它会检查您的私钥是否与其保存的公钥匹配。如果匹配,您无需输入密码即可即时访问。
无法通过公钥推导出私钥,这使得该系统极为安全。您的私钥应当保密并仅保存在您的计算机上,请务必不要与任何人共享。
> 若想进一步了解安全连接在更广泛网络安全版图中的定位,欢迎学习 Introduction to Data Security 课程。
与传统密码认证相比,SSH 密钥的优势包括:
- 更高的安全性——与密码不同,SSH 密钥由于长度和复杂度(通常为 2048 位或更高)而无法被猜测或暴力破解。
- 更好的便捷性——一旦完成设置,您无需每次都输入密码即可连接服务器。
- 利于自动化——非常适合需要安全认证的脚本和自动化流程。
- 集中式访问管理——只需管理服务器上的公钥即可添加或撤销访问权限。
- 告别密码疲劳——无需创建、记忆或定期更改复杂密码。
几乎所有支持 SSH 的系统都能使用 SSH 密钥,包括 Linux 服务器、云平台,以及 GitHub、GitLab 等代码仓库。它们已成为专业环境中安全远程访问的标准。
> 对云端从业者而言,同时掌握安全与成本效率至关重要——详见 AWS Security and Cost Management 课程。
现在您已了解 SSH 密钥是什么,接下来将学习如何生成。
如何生成 SSH 密钥
无论操作系统为何,创建 SSH 密钥只需几分钟。
该过程会生成两个文件:您的私钥(必须安全保存在本机)和您的公钥(用于添加到远程服务器)。
在 Linux/MacOS 上生成 SSH 密钥
在 Linux 或 MacOS 上,您将使用内置的 ssh-keygen 命令。首先打开终端并输入:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
该命令会创建一个 4096 位加密(非常安全)的 RSA 密钥,并将您的邮箱作为注释以便识别。
系统会询问保存位置以及是否添加口令(passphrase)。默认位置适合大多数用户,但口令值得考虑。
一个强口令能增加额外的安全层——即使有人获取了您的私钥文件,若不知道口令也无法使用。

图 1 - 在 Linux/macOS 上创建 SSH 密钥对
确认选择后,系统会在您主目录下的 .ssh 目录中创建两把密钥:
- 私钥:无扩展名的文件(如
id_rsa)。 - 公钥:带有
.pub扩展名的文件(如id_rsa.pub)。

图 2 - 已创建的密钥文件
在 Windows 上生成 SSH 密钥
Windows 用户有两种不错的选择来创建 SSH 密钥——Git Bash 和 WSL。
Git Bash 提供类似 Linux/MacOS 的命令行体验。如果您安装了 Git for Windows,就已经拥有该工具。打开 Git Bash,使用与上文相同的 ssh-keygen 命令。
Windows Subsystem for Linux(WSL) 也是不错的选择,如果您更喜欢在 Windows 机器上使用 Linux 环境。命令与原生 Linux 系统完全相同。
如果您偏好图形界面,PuTTYgen 提供更直观的方式。

图 3 - 在 Windows 上使用 PuTTYgen 生成密钥
以下是创建密钥对的步骤:
- 从开始菜单启动 PuTTYgen。
- 选择 RSA 作为密钥类型。
- 点击“Generate”,并在空白区域随机移动鼠标。
- 添加口令以提升安全性。
- 使用对应按钮分别保存公钥和私钥。

图 4 - 已创建的密钥文件(2)
了解密钥文件
SSH 密钥生成过程会创建一对配合使用的文件。
您的私钥必须在本机保密、安全存放。可将其视为证明您身份的万能钥匙。私钥通常命名如下:
id_ed25519(用于 Ed25519 密钥)。id_rsa(用于 RSA 密钥)。
您的公钥可以放心地与任何要访问的系统共享。它就像一把只有您的私钥才能打开的锁。公钥与对应的私钥同名,但会多一个 .pub 扩展名。
该系统的安全性完全依赖于对私钥的妥善保护。
切勿共享、邮件发送或存储在不受信任的设备上。如果您认为私钥已泄露,请立即生成新的密钥对,并更新所有存有旧公钥的服务器。
您可以通过以下命令查看公钥内容:
cat ~/.ssh/id_rsa.pub

图 5 - 公钥内容
输出会显示配置远程服务器时需要的完整字符串,我们将在下一节进行讲解。
如何将 SSH 密钥添加到远程系统
创建好 SSH 密钥对后,您需要将公钥添加到每个要访问的远程系统。通俗来说,就是让远程服务器认可您的私钥是一种有效的认证方式。
将公钥添加到远程服务器
步骤并不复杂;您只需将公钥添加到远程服务器的一个特殊文件中。该文件名为 authorized_keys,其中包含允许连接的公钥列表。
添加密钥的最简单方式是使用 ssh-copy-id 命令:
ssh-copy-id username@remote_host
该命令会连接远程服务器,若必要则创建相应目录,并将您的公钥添加到 authorized_keys 文件中。此过程中,您需要最后一次输入密码。

图 6 - authorized_keys 文件内容
如果您的系统没有 ssh-copy-id 命令,也可以手动完成,但需要几个步骤。
按以下指引逐条运行命令:
# 显示公钥并复制
cat ~/.ssh/id_rsa.pub
# 使用密码认证连接到远程服务器
ssh username@remote_host
# 若不存在则创建 .ssh 目录
mkdir -p ~/.ssh
# 打开或创建 authorized_keys 文件并粘贴您的公钥
echo "your_copied_public_key" >> ~/.ssh/authorized_keys
就是这样!
如果您需要将密钥提供给系统管理员的服务器,只需将公钥文件内容发送给他们,他们会为您添加到服务器。
为密钥认证配置 SSH
添加公钥后,您可能希望进一步配置 SSH 服务器以增强安全性。以下步骤需要管理权限(sudo)。
要编辑 SSH 服务器配置,请打开主配置文件:
sudo nano /etc/ssh/sshd_config

图 7 - sshd_config 文件内容
在该文件中,您可以进行以下安全增强:
- 将
PasswordAuthentication no设置为禁用基于密码的登录。 - 确保启用
PubkeyAuthentication yes(通常默认启用)。 - 考虑设置
PermitRootLogin prohibit-password,以禁止使用密码的 root 登录。
修改完成后,请记得重启 SSH 服务以应用变更:
sudo systemctl restart sshd
此外需要注意,正确的文件权限对 SSH 密钥认证至关重要。SSH 服务器对安全性要求非常严格,如果权限过于开放会拒绝连接。请确保以下权限设置:
- 主目录:
chmod 755 ~。 .ssh目录:chmod 700 ~/.ssh。authorized_keys文件:chmod 600 ~/.ssh/authorized_keys。
在公钥就位且服务器配置妥当后,您现在可以在不输入密码的情况下连接远程服务器。
下一节将演示如何使用 SSH 密钥进行认证。
如何使用 SSH 密钥进行认证
您已经准备好享受免密认证带来的便捷与安全。下面来看如何使用 SSH 密钥连接服务器和代码仓库。
使用 SSH 密钥认证连接远程服务器
使用 SSH 密钥连接服务器与常规 SSH 访问类似,但不会出现密码提示。打开终端并使用标准 SSH 命令:
ssh username@hostname
如果您的密钥保存在默认位置(~/.ssh/id_rsa),SSH 会自动查找并使用它。若创建密钥时设置了口令,您需要输入一次,但每个会话只需输入一次。
如果密钥存放在非默认位置,请使用 -i 参数指定路径:
ssh -i ~/path/to/your/private_key username@hostname

图 8 - 通过 SSH 连接远程服务器
每次连接都输入口令会比较繁琐。这时SSH 代理(SSH agent)就派上用场了。它在后台运行,将解密后的私钥安全地保存在内存中,因此您每个会话只需输入一次口令。
启动 SSH 代理并添加您的密钥:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

图 9 - SSH 代理
您将输入一次口令,随后在本次会话期间,代理会为后续所有连接处理认证。这在需要多次连接服务器或使用会建立多个 SSH 连接的应用时非常有用。
在 macOS 上,SSH 代理会自动启动,您可在首次连接时启用“将口令记入钥匙串”,以避免今后重复输入。遗憾的是,此功能仅适用于 macOS。
将 SSH 密钥用于 GitHub/GitLab 认证
GitHub 和 GitLab 等服务也支持 SSH 密钥认证,并推荐优先于基于密码的认证方式。
要将 SSH 密钥添加到 GitHub,先打开 GitHub 并登录账户。然后点击右上角头像并选择“Settings”。在侧边栏中点击“SSH and GPG keys”:

图 10 - GitHub 认证设置(1)
点击“New SSH key”,为密钥起一个具有描述性的标题,将公钥粘贴到“Key”字段,最后点击“Add SSH key”:

图 11 - GitHub 认证设置(2)
完成后,您会看到一条成功消息,提示密钥已添加到您的账户:

图 12 - GitHub 认证设置(3)
添加密钥后,您可以使用 SSH URL(而非 HTTPS URL)来克隆、拉取和推送仓库。可使用如下命令:
git clone git@github.com:username/repository.git

图 13 - 通过 SSH 克隆仓库
就是这么简单。GitLab 的流程 也非常相似——只需在账户设置中找到 SSH Keys 即可。
总之,使用 SSH 执行 Git 操作意味着您无需在每次与远程仓库交互时输入用户名和密码。SSH 密钥会自动提供安全认证。
如果您同时使用多个服务(如 GitHub 和 GitLab),不妨为每个服务创建单独的密钥。一旦某个密钥泄露,这种做法能降低风险暴露。
> 若想更深入地管理代码仓库,请 查看 Intermediate GitHub Concepts。
管理 SSH 密钥
当您在多个系统和服务中使用 SSH 密钥时,迟早需要一套管理方法。
本节将介绍如何跟踪现有密钥、移除过期或被攻陷的密钥,以及排查潜在问题。
查看与列出 SSH 密钥
您可以查看主目录下 .ssh 目录中的所有 SSH 密钥。该目录包含私钥及其对应的公钥。
运行以下命令列出 SSH 目录中的所有文件:
ls -la ~/.ssh

图 14 - .ssh 目录中的所有文件
该命令会显示目录中的所有文件(包括隐藏文件)。您通常会看到如下文件:
id_rsa- 您的 RSA 私钥。id_rsa.pub- 您的 RSA 公钥。known_hosts- 您曾连接过的服务器列表。authorized_keys- 被允许访问此机器的公钥列表(若其被配置为服务器)。config- 您的 SSH 客户端配置(如果已创建)。
如果您为不同服务创建了多把密钥,将会看到以创建时指定名称命名的其他密钥对。
要查看某个特定公钥的内容,请运行:
cat ~/.ssh/id_rsa.pub

图 15 - 公钥内容
这会显示完整的公钥,以 ssh-rsa 开头,以您的注释(通常为邮箱)结尾。
移除 SSH 密钥
随着时间推移,您可能需要因不同原因移除 SSH 密钥——例如升级为更强的密钥类型、设备遗失,或不再需要访问某些系统。
要从远程服务器移除密钥,您需要编辑 authorized_keys 文件:
# 连接至远程服务器
ssh username@remote_host
# 打开 authorized_keys 文件:
nano ~/.ssh/authorized_keys
对于 GitHub 和 GitLab,移除密钥更为简单:
- 进入账户设置。
- 导航到“SSH and GPG keys”部分。
- 找到要移除的密钥。
- 点击该密钥旁的删除图标。

图 16 - 在 GitHub 上确认删除密钥
最后,若要从本机移除密钥,只需删除相应文件:
rm ~/.ssh/id_rsa ~/.ssh/id_rsa.pub
将 id_rsa 替换为您想要移除的密钥名称。
如果需要从 known_hosts 文件中移除某个远程主机(通常在服务器重新配置后),请运行:
ssh-keygen -R hostname
该命令会从 known_hosts 文件中移除指定主机的条目,遇到“host key verification failed”错误时非常有用。
排查常见 SSH 密钥问题
SSH 密钥认证有时会因各种原因失败。本节将给出常见问题的解决方案。
- 权限问题。出于安全考虑,SSH 对文件权限要求严格;若权限不当,认证会失败。请使用以下命令修复:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys
- 口令问题。如果您忘记了口令,遗憾的是无法找回。您需要执行以下步骤:
- 生成新的密钥对。
- 将新的公钥添加到远程系统。
- 移除旧的密钥对。
- 连接被拒绝。若出现“Connection refused”错误,可能原因很多。请按以下步骤排查:
- 确认服务器正在运行且可达。
- 检查服务器上的 SSH 服务是否在运行。
- 确认使用了正确端口(默认 22)。
- 认证失败。若出现“Permission denied (publickey)”错误,请按以下步骤处理:
- 确保已将公钥正确添加到服务器的
authorized_keys文件。 - 检查服务器是否允许公钥认证。
- 确认使用了正确的用户名和主机名。
- 确保正在使用正确的私钥。
- 代理相关问题。如果 SSH 代理未正常工作,可按以下步骤处理:
- 使用
ssh-add -l确认代理正在运行。 - 如果未运行,使用
eval "$(ssh-agent -s)"启动。 - 使用
ssh-add ~/.ssh/id_rsa添加您的密钥。
接下来,让我们看看 SSH 密钥管理的一些最佳实践。
SSH 密钥管理最佳实践
SSH 认证非常有助于保护系统免受未授权访问,但坦率说,有时也会带来一些麻烦。下面的建议旨在在强安全性与日常便利之间取得平衡。
为 SSH 密钥使用强口令
当他人获取到您的私钥文件时,私钥口令就是最后一道防线。请务必选择强且唯一的口令,难以被猜测,但便于您记忆。
优秀口令的特征包括:
- 至少 12–15 个字符。
- 包含大小写字母、数字与特殊字符的组合。
- 避免常见模式或字典词汇。
- 不与其他服务复用。
对访问关键系统或生产环境的密钥而言,强口令尤为必要。偶尔输入口令带来的小小不便,远不及安全风险。
借助 SSH 代理,您每个会话只需输入一次口令,这使强口令在日常使用中切实可行。建议使用密码管理器安全存储复杂口令。
针对不同系统使用不同密钥
请勿在所有地方使用同一把密钥,而应根据不同服务或安全级别创建独立的密钥对。这样一来,即使某把密钥失陷,风险也可被隔离。
例如,您可以创建:
- 一把用于公司服务器的工作密钥。
- 一把用于个人项目的密钥。
- 一把专用于 GitHub 或 GitLab 的密钥。
- 一把用于生产系统的高安全密钥。
虽然会带来些许不便,但非常值得。
在创建多把密钥时,请使用能体现用途的描述性文件名:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/github_rsa -C "github access"
要在连接时使用特定密钥,您可以方便地设置一个配置文件:
# ~/.ssh/config
Host github.com
IdentityFile ~/.ssh/github_rsa
Host companyserver
HostName 255.255.255.255
User ubuntu
IdentityFile ~/.ssh/company_server_rsa
这种做法可确保即使某把密钥遭到破坏,您也只需更换该密钥,而无需更新所有系统。
定期轮换 SSH 密钥
定期更换 SSH 密钥可降低未被发现的泄露风险,并符合安全最佳实践。
轮换频率取决于敏感程度:
- 个人项目: 每 1–2 年。
- 业务系统: 每 6–12 个月。
- 高安全环境: 每 3–6 个月。
- 在团队成员离职或发生可疑活动后立即轮换。
轮换 SSH 密钥的流程包括:创建新的密钥对、将新公钥添加到服务器、验证新密钥可用、从服务器移除旧公钥,以及从本机删除旧私钥。
换言之,这需要一定时间,请在计划中预留。
此外,建议维护一份记录,标明哪些密钥可访问哪些系统。对于组织而言,考虑实施自动化密钥管理工具,以系统化地进行轮换。
强制启用 SSH 密钥认证
您可以实施的最强安全措施,是在服务器上完全禁用密码认证,要求所有连接都使用 SSH 密钥。
按以下步骤强制启用基于密钥的认证:
# 编辑 SSH 服务器配置
sudo nano /etc/ssh/sshd_config
# 设置以下关键安全选项
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
# 重启 SSH 服务
sudo systemctl restart sshd
此配置可彻底阻止基于密码的暴力破解攻击。
但在做出这些更改之前,请确保 SSH 密钥认证已正常工作,以免将自己锁在门外。确实会发生。
SSH 密钥小结
总而言之,SSH 密钥会改变您连接远程系统的方式。从密码切换到基于密钥的认证,将在安全与便捷两方面提升您的日常工作体验。
另一个好处是流程并不复杂。您需要生成密钥、将其添加到要访问的服务器,然后无需输入密码即可连接。就这么简单!与传统基于密码的认证相比,SSH 密钥让连接更快、更可靠,同时还能阻断如猜密码等常见攻击手段。
请记住,您的私钥需要保护。 使用强口令,妥善保管您的密钥,并遵循本文列出的最佳实践,尤其是关于对 SSH 密钥进行隔离管理的部分。
如果您想进一步了解 SSH 密钥以及命令行的通用用法,DataCamp 的以下课程是不错的下一站:
FAQs
SSH 密钥相较密码有哪些优势?
SSH 密钥提供更强的安全性,因为它们不像密码那样会被暴力破解。此外,它们也更方便,您无需为每次连接都输入密码。并且,SSH 密钥还能为需要建立安全连接的脚本和程序提供安全的自动化能力。
设置 SSH 密钥需要技术技能吗?
具备基础命令行知识会有所帮助,但并非必需。设置过程只需运行少量简单命令来生成密钥并将其添加到远程系统。即使您是命令行新手,也可按照本文的分步说明成功部署 SSH 密钥。
我可以在所有操作系统上使用 SSH 密钥吗?
需要。SSH 密钥可在 Windows、macOS、Linux 以及其他类 Unix 系统上使用。所有现代操作系统要么默认包含 SSH 工具,要么可通过可选软件包轻松安装。同一对密钥也可跨不同操作系统使用。
如何排查“Permission denied (publickey)”错误?
该常见错误通常表示您的密钥未在服务器上正确注册。请确认公钥已正确添加到远程系统的 authorized_keys 文件;检查文件权限是否正确(私钥应为 600);并确保连接时使用了正确的用户名和主机名。
同一把 SSH 密钥能同时用于工作和个人项目吗?
从技术上讲可以,但出于安全原因并不推荐。为不同环境使用独立密钥可以在某把密钥泄露时降低风险暴露。为工作、个人项目和敏感系统分别创建密钥,有助于维持更清晰的安全边界。
