跳至内容
数据工程

SSH 密钥详解:快速且安全的远程访问指南

本完整指南将向您展示如何设置、使用和管理 SSH 密钥,从而更快速、更安全地访问任意系统。
Dario Radečić's photo
Dario Radečić
已更新 · 15分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。

每次连接远程服务器或 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 密钥对

图 1 - 在 Linux/macOS 上创建 SSH 密钥对

确认选择后,系统会在您主目录下的 .ssh 目录中创建两把密钥:

  • 私钥:无扩展名的文件(如 id_rsa)。
  • 公钥:带有 .pub 扩展名的文件(如 id_rsa.pub)。

图 2 - 已创建的密钥文件

图 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 生成密钥

图 3 - 在 Windows 上使用 PuTTYgen 生成密钥

以下是创建密钥对的步骤:

  1. 从开始菜单启动 PuTTYgen。
  2. 选择 RSA 作为密钥类型。
  3. 点击“Generate”,并在空白区域随机移动鼠标。
  4. 添加口令以提升安全性。
  5. 使用对应按钮分别保存公钥和私钥。

图 4 - 已创建的密钥文件(2)

图 4 - 已创建的密钥文件(2)

了解密钥文件

SSH 密钥生成过程会创建一对配合使用的文件。

您的私钥必须在本机保密、安全存放。可将其视为证明您身份的万能钥匙。私钥通常命名如下:

  • id_ed25519(用于 Ed25519 密钥)。
  • id_rsa(用于 RSA 密钥)。

您的公钥可以放心地与任何要访问的系统共享。它就像一把只有您的私钥才能打开的锁。公钥与对应的私钥同名,但会多一个 .pub 扩展名。

该系统的安全性完全依赖于对私钥的妥善保护。

切勿共享、邮件发送或存储在不受信任的设备上。如果您认为私钥已泄露,请立即生成新的密钥对,并更新所有存有旧公钥的服务器。

您可以通过以下命令查看公钥内容:

cat ~/.ssh/id_rsa.pub

图 5 - 公钥内容

图 5 - 公钥内容

输出会显示配置远程服务器时需要的完整字符串,我们将在下一节进行讲解。

如何将 SSH 密钥添加到远程系统

创建好 SSH 密钥对后,您需要将公钥添加到每个要访问的远程系统。通俗来说,就是让远程服务器认可您的私钥是一种有效的认证方式。

将公钥添加到远程服务器

步骤并不复杂;您只需将公钥添加到远程服务器的一个特殊文件中。该文件名为 authorized_keys,其中包含允许连接的公钥列表。

添加密钥的最简单方式是使用 ssh-copy-id 命令:

ssh-copy-id username@remote_host

该命令会连接远程服务器,若必要则创建相应目录,并将您的公钥添加到 authorized_keys 文件中。此过程中,您需要最后一次输入密码。

图 6 - 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 文件内容

图 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 连接远程服务器

图 8 - 通过 SSH 连接远程服务器

每次连接都输入口令会比较繁琐。这时SSH 代理(SSH agent)就派上用场了。它在后台运行,将解密后的私钥安全地保存在内存中,因此您每个会话只需输入一次口令。

启动 SSH 代理并添加您的密钥:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

图 9 - SSH 代理

图 9 - SSH 代理

您将输入一次口令,随后在本次会话期间,代理会为后续所有连接处理认证。这在需要多次连接服务器或使用会建立多个 SSH 连接的应用时非常有用。

在 macOS 上,SSH 代理会自动启动,您可在首次连接时启用“将口令记入钥匙串”,以避免今后重复输入。遗憾的是,此功能仅适用于 macOS。

将 SSH 密钥用于 GitHub/GitLab 认证

GitHub 和 GitLab 等服务也支持 SSH 密钥认证,并推荐优先于基于密码的认证方式。

要将 SSH 密钥添加到 GitHub,先打开 GitHub 并登录账户。然后点击右上角头像并选择“Settings”。在侧边栏中点击“SSH and GPG keys”:

图 10 - GitHub 认证设置(1)

图 10 - GitHub 认证设置(1)

点击“New SSH key”,为密钥起一个具有描述性的标题,将公钥粘贴到“Key”字段,最后点击“Add SSH key”:

图 11 - GitHub 认证设置(2)

图 11 - GitHub 认证设置(2)

完成后,您会看到一条成功消息,提示密钥已添加到您的账户:

图 12 - GitHub 认证设置(3)

图 12 - GitHub 认证设置(3)

添加密钥后,您可以使用 SSH URL(而非 HTTPS URL)来克隆、拉取和推送仓库。可使用如下命令:

git clone git@github.com:username/repository.git

图 13 - 通过 SSH 克隆仓库

图 13 - 通过 SSH 克隆仓库

就是这么简单。GitLab 的流程 也非常相似——只需在账户设置中找到 SSH Keys 即可。

总之,使用 SSH 执行 Git 操作意味着您无需在每次与远程仓库交互时输入用户名和密码。SSH 密钥会自动提供安全认证。

如果您同时使用多个服务(如 GitHub 和 GitLab),不妨为每个服务创建单独的密钥。一旦某个密钥泄露,这种做法能降低风险暴露。

> 若想更深入地管理代码仓库,请 查看 Intermediate GitHub Concepts。

管理 SSH 密钥

当您在多个系统和服务中使用 SSH 密钥时,迟早需要一套管理方法。

本节将介绍如何跟踪现有密钥、移除过期或被攻陷的密钥,以及排查潜在问题。

查看与列出 SSH 密钥

您可以查看主目录下 .ssh 目录中的所有 SSH 密钥。该目录包含私钥及其对应的公钥。

运行以下命令列出 SSH 目录中的所有文件:

ls -la ~/.ssh

图 14 - .ssh 目录中的所有文件

图 14 - .ssh 目录中的所有文件

该命令会显示目录中的所有文件(包括隐藏文件)。您通常会看到如下文件:

  • id_rsa - 您的 RSA 私钥。
  • id_rsa.pub - 您的 RSA 公钥。
  • known_hosts - 您曾连接过的服务器列表。
  • authorized_keys - 被允许访问此机器的公钥列表(若其被配置为服务器)。
  • config - 您的 SSH 客户端配置(如果已创建)。

如果您为不同服务创建了多把密钥,将会看到以创建时指定名称命名的其他密钥对。

要查看某个特定公钥的内容,请运行:

cat ~/.ssh/id_rsa.pub

图 15 - 公钥内容

图 15 - 公钥内容

这会显示完整的公钥,以 ssh-rsa 开头,以您的注释(通常为邮箱)结尾。

移除 SSH 密钥

随着时间推移,您可能需要因不同原因移除 SSH 密钥——例如升级为更强的密钥类型、设备遗失,或不再需要访问某些系统。

要从远程服务器移除密钥,您需要编辑 authorized_keys 文件:

# 连接至远程服务器
ssh username@remote_host

# 打开 authorized_keys 文件:
nano ~/.ssh/authorized_keys

对于 GitHub 和 GitLab,移除密钥更为简单:

  1. 进入账户设置。
  2. 导航到“SSH and GPG keys”部分。
  3. 找到要移除的密钥。
  4. 点击该密钥旁的删除图标。

图 16 - 在 GitHub 上确认删除密钥

图 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 密钥能同时用于工作和个人项目吗?

从技术上讲可以,但出于安全原因并不推荐。为不同环境使用独立密钥可以在某把密钥泄露时降低风险暴露。为工作、个人项目和敏感系统分别创建密钥,有助于维持更清晰的安全边界。


Dario Radečić's photo
Author
Dario Radečić
LinkedIn
常驻克罗地亚的高级数据科学家。顶级科技写作者,已发表 700 多篇文章,累计获得超过 1,000 万次阅读。著有《使用 TPOT 实现机器学习自动化》。
主题
数据工程

通过这些课程学习数据工程与安全!

课程

数据安全入门

2 小时
15.3K
了解如何成为数据守护者,并通过这门适合初学者的互动课程保护数据安全。
查看详情开始课程

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。
查看更多