如何使用PuTTY创建SSH密钥以连接到VPS
公有和私有 SSH 密钥的好处
如果您的无头或远程 VPS 在 Internet 上可见,则应尽可能使用公钥身份验证而不是密码。 这是因为与单独使用密码相比,SSH 密钥提供了一种更安全的登录方式。 虽然最终可以通过 暴力攻击 破解密码,但仅靠暴力破解几乎不可能破译 SSH 密钥。 使用公钥身份验证,每台计算机都有(i)一个公共和(ii)一个私人“密钥”(两种数学关联的算法,实际上不可能破解)。
今天,OpenSSH 是 Linux 和 OS X 等类 Unix 系统上的默认 SSH 实现。 基于密钥的身份验证是可用于 OpenSSH 的几种身份验证模式中最安全的一种,例如普通密码和 Kerberos 票证。 其他身份验证方法仅在非常特定的情况下使用。 SSH 可以使用“RSA”(Rivest-Shamir-Adleman)或“DSA”(“数字签名算法”)密钥。 当 SSH 被发明时,这两种算法都被认为是最先进的算法,但近年来 DSA 被认为不太安全。 RSA 是唯一推荐的新密钥选择,因此本教程交替使用“RSA 密钥”和“SSH 密钥”。
当您登录到您的 DigitalOcean VPS 时,SSH 服务器使用公钥以一种只能由您的私钥“解锁”的方式“锁定”消息。 这意味着即使是最足智多谋的攻击者也无法窥探或干扰您的会话。 作为一项额外的安全措施,一些用户和大多数 SSH 程序以受密码保护的格式存储私钥,以提供一个时间窗口,在您的计算机被盗或被入侵时,您可以禁用受损的公钥。 由于这些原因,对于大多数人来说,公钥身份验证是比密码更好的解决方案。 事实上,通过不在您的私钥上使用密码,您将能够通过安全、自动登录(例如增量异地备份)自动化部分配置管理,通过 DigitalOcean API 管理您的 DigitalOcean 资产,和更多。
基于密钥的 SSH 登录
您可以将相同的公钥保存在任意数量的云服务器上,而您的私钥保存在您登录服务器的客户端上。 然后,您可以禁用正常的用户名/密码登录程序,这意味着只有拥有有效私钥/公钥对的人才能登录; 使您的系统更安全,因为它不会受到暴力攻击。
自动创建新液滴
SSH 密钥的另一个有用用途是创建 DigitalOcean 液滴。 如您所知,当您启动一个 Droplet 时,您必须等待一封包含您密码的电子邮件。 虽然这封电子邮件非常方便,但有一种更安全(更快)的方式可以在无需电子邮件的情况下访问您的新云服务器。 这可以通过将您的公钥保存在 DigitalOcean 控制面板 中来完成。 要做到这一点:
- 首先完成本教程中标题为 Generating OpenSSH-compatible Keys for Use with PuTTY 的部分。
- 然后,跳到如何在DigitalOcean Droplets中使用SSH密钥的第三步。
先决条件
本教程假设您熟悉 DigitalOcean' 的 如何使用 PuTTY 登录到您的 Droplet(适用于 Windows 用户) 的指南。
PuTTY 密钥生成器(又名 腻子)
虽然 PuTTY 是 SSH 的客户端程序(除了 Telnet 和 Rlogin),但它不是 OpenSSH 的端口或基于 OpenSSH。 因此,PuTTY 不支持读取 OpenSSH 的 SSH-2 私钥文件。 但是,PuTTY 确实有一个名为 PuTTYgen(一个 RSA 和 DSA 密钥生成实用程序)的伴侣,可以将 OpenSSH 私钥文件转换为 PuTTY 的格式; 允许您通过 SSH 密钥提供的额外安全性从 Windows 机器连接到云服务器。
PuTTYgen 是一个(免费)开源实用程序,可以从 maintainer' 的网站 下载。 PuTTYgen 是您将用来生成 SSH 密钥以在 PuTTY 中使用的工具。 首先,您需要做的就是下载可执行文件 (.exe) 并将它们保存在您将用于连接到 VPS 的计算机上,例如 在桌面上。 您将 而不是 需要“安装” PuTTYgen,因为它是一个独立的应用程序。
生成与 PuTTY 一起使用的 OpenSSH 兼容密钥
使用 PuTTYgen 生成一组 RSA 密钥:
- 双击 .exe 文件启动 PuTTYgen 实用程序;
- 对于要生成的密钥类型,选择RSA;
- 在 Number of bits in a generated key 字段中,指定 2048 或 4096(增加位数会使通过暴力破解方法更难破解密钥);
- 点击【X10X】生成【X22X】按钮;
- 在进度条下方的 Key 部分的空白区域中移动鼠标指针(以产生一些随机性),直到进度条已满;
- 现在已经生成了一个私钥/公钥对;
- 在 Key comment 字段中,输入 any comment you'd like,以帮助您识别此密钥对,稍后(例如 您的电子邮件地址; 家; 办公室; 等)——如果您最终创建了多个密钥对,则密钥注释特别有用;
- 选修的 : 在密钥密码字段并重新输入相同的密码确认密码字段(但是,如果您想将密钥用于自动化流程,则应该不是创建密码);
- 点击保存公钥按钮并选择您想要的任何文件名(有些用户在他们的计算机中创建一个名为我的钥匙 );
- 点击保存私钥按钮并选择您想要的任何文件名(您可以将其保存在与公钥相同的位置,但它应该是只有您可以访问并且您不会丢失的位置! 如果您丢失了密钥并禁用了用户名/密码登录,您将无法再登录!);
- 右键单击标记为 用于粘贴到 OpenSSH 授权密钥文件的公钥 的文本字段,然后选择 全选;
- 再次右键单击同一文本字段并选择 Copy。
注意: PuTTY 和 OpenSSH 对公共 SSH 密钥使用不同的格式。 如果您复制的 SSH Key 以“---- BEGIN SSH2 PUBLIC KEY ...”开头,则格式错误。 请务必仔细按照说明进行操作。 您的密钥应以“ssh-rsa AAAA ....”开头
将公钥保存在服务器上
现在,您需要将复制的公钥粘贴到服务器上的文件 ~/.ssh/authorized_keys 中。
- 登录到您的目标服务器; 见 如何用PuTTY登录你的Droplet(windows用户)
- 如果您的 SSH 文件夹尚不存在,请手动创建它:
- 将 SSH 公钥粘贴到您的 ~/.ssh/authorized_keys 文件中(参见 在云服务器上安装和使用 Vim 文本编辑器):
- 点击
i
键盘上的键并右键单击鼠标进行粘贴。 - 要保存,请点击键盘上的以下键(按此顺序):
Esc
、:
、w
、q
、Enter
.
创建 PuTTY 配置文件以保存服务器的设置
在 PuTTY 中,您可以创建(并保存)用于连接到各种 SSH 服务器的配置文件,因此您不必记住并不断重新输入冗余信息。
- 双击可执行文件启动PuTTY;
- PuTTY' 的初始窗口是 Session 类别(在窗口左侧导航 PuTTY' 的各种类别);
- 在 Host Name 字段中,输入您的 VPS 的 IP 地址或其完全限定域名 (FQDN); 见 如何使用DigitalOcean设置主机名
- 在 Port 字段中输入端口号(为了增加安全性,请考虑将服务器 ' 的 SSH 端口更改为非标准端口。 参见 使用 Ubuntu 12.04初始服务器设置的第五步
- 选择Protocol下的SSH;
- 在窗口的左侧,选择 Connection 下的 Data 子类别;
- 在 Auto-login username 字段中指定您在登录 SSH 服务器时计划使用的用户名,以及您 ' 正在保存的配置文件;
- 展开 SSH 子类别,在 Connection 下;
- 突出显示 Auth 子类别并单击 PuTTY 窗口右侧的 Browse 按钮;
- 浏览您的文件系统并选择您之前创建的私钥;
- 返回到 Session 类别并在 Saved Sessions 字段中输入此配置文件的名称,例如 user@123.456.78.9 或 user@host.yourdomain.tld;
- 单击 Load、Save 或 Delete a stored session 区域的 Save 按钮。
现在您可以继续登录到 user@1.2.3.4 并且会提示您 而不是 输入密码。 但是,如果您在您的公钥上设置了密码,您 将 被要求在当时(以及以后每次登录时)输入密码。
禁用用户名/密码登录
一旦您确认您的基于密钥的登录正常工作,您可以选择禁用用户名/密码登录以实现更好的安全性。 为此,您需要编辑 SSH 服务器的配置文件。 在 Debian/Ubuntu 系统上,此文件位于 /etc/ssh/sshd_config。
sudo vim /etc/ssh/sshd_config
点击键盘上的 i
键并编辑行,如下所示:
[...] PasswordAuthentication no [...] UsePAM no [...]
要保存,请点击键盘上的以下键(按此顺序):Esc
、:
、w
、q
、Enter
. 现在,重新加载 SSH 服务器的配置:
sudo reload ssh
其他资源
- 如何设置 SSH 密钥 | 数字海洋;
- 如何在 Ubuntu 12.04 上使用 fail2ban 保护 SSH | 数字海洋;
- 如何使用双重身份验证保护 SSH | 数字海洋;
- 如何通过 SSH 使用 Rsync 复制文件 | 数字海洋;
- 公钥密码学 | 维基百科;
- 腻子常见问题解答 | 西蒙·泰瑟姆。
与往常一样,如果您在本 HowTo 中的步骤方面需要帮助,请通过在下方提出您的问题向 DigitalOcean 社区寻求帮助。