配置SSH密钥登录
SSH登录的方式
SSH(Secure Shell)是一种网络协议,用于在网络上安全地执行命令和传输文件。SSH 的主要目的是通过加密和身份验证来提供安全的远程访问。在 Linux 系统中,使用 SSH 登录可以采用多种方式,其中最常见的是密码登录和密钥登录。
1.密码登录: 用户通过提供用户名和密码进行身份验证。
2.密钥登录:
- 用户通过 SSH 密钥对进行身份验证,包括公钥和私钥。公钥存储在服务器上,私钥存储在客户端。
- 在生成密钥对时可以选择不设置密码。这样,私钥无需密码保护,用户可以直接使用私钥登录。
密钥登录通常被认为更安全,因为它不依赖于密码,而且可以通过禁用密码登录来增加安全性。
常见的SSH工具
有许多 SSH 登录工具可用,常见的有:
OpenSSH:OpenSSH
是 SSH
协议的开源实现,几乎在所有主流的 Linux
发行版中预装。它包含 ssh
(用于登录和执行命令)、scp
(用于文件传输)和其他相关工具。
Xshell:Xshell
是一款面向 Windows
用户的强大 SSH
客户端,提供了图形用户界面和各种功能。它支持 SSH1
、SSH2
、SFTP
、Telnet
、Rlogin
等多种协议,并具有会话管理、多标签、分屏等功能。有免费版和商业版,商业版提供更多高级功能和技术支持。
FinalShell:FinalShell
是一款免费的国产的SSH
工具,同时支持Windows
,macOS
,Linux
三个平台。
本文使用的工具为Xshell
。
密钥登录的原理
密钥登录是一种使用 非对称密钥对 进行身份验证的方式,以下是密钥登录的基本原理:
-
密钥对生成: 用户通过非对称加密算法生成一对非对称密钥,包括公钥和私钥。
- 公钥是公开的,而私钥是保密的。
- 公钥用于加密数据,私钥用于解密数据。
如何生成密钥:生成密钥对
-
公钥部署到服务器: 用户将生成的公钥提前部署到远程服务器上。
通常,公钥会添加到服务器上的
~/.ssh/authorized_keys
文件中,以便服务器能够识别和信任这个公钥。 -
连接请求: 用户使用 SSH 客户端发起连接请求到服务器,表明它想要进行身份验证并建立安全连接。
-
服务器生成随机字符串,并使用公钥加密: 服务器在接收到连接请求后,会生成一个随机字符串,并使用客户端提供的公钥对该字符串进行加密。这样,只有客户端的私钥才能解密这个字符串。服务器将加密后的字符串发送给客户端。
-
客户端解密: 客户端使用自己的私钥对服务器发送的加密字符串进行解密,得到原始的随机字符串,然后将解密后的随机字符串发送回服务器。
-
服务器验证: 服务器比较客户端发送的字符串与自己生成的字符串是否一致。如果一致,说明客户端拥有相应的私钥,认证成功。
简单总结:① 生成密钥对 — ② 将公钥保存到服务器 — ③ 用户发送SSH请求,尝试连接到服务器 — ④ 服务器使用公钥加密一个随机字符串,发送到客户端 — ⑤ 客户端使用私钥解密得到原始字符串,返回给服务器 — ⑥ 服务器验证得到的字符串和原始字符串是否一致,若一致,则登录成功。
密钥登录的原理基于非对称加密。服务器使用公钥对生成的随机字符串进行加密,只有拥有对应私钥的客户端才能解密并回传正确的字符串,从而完成身份验证。这种方式相对于传统的用户名和密码登录更加安全,因为私钥通常要比密码更难被破解。
生成密钥对
这里介绍两种方式,一是使用Xshell工具,二是使用Linux命令。
使用Xshell工具
打开Xshell客户端,选择“工具”—“新建用户密码生成向导”。

选择“密钥类型”和“密钥长度”,无特殊需求,保持默认即可,点击“下一步”。

然后,会显示“密钥对已经成功生成”,然后点击“下一步”。

输入“密钥名称”和“密钥加密密码”,然后点击“下一步”。
密钥名称:可以是任意名称。
密钥加密密码:设置对私钥进行加密的密码,这个操作是可选的。由于公钥是公开的,所以不需要进行加密。私钥是机密的,这里设置密码是为了防止私钥别盗取。设置了密码之后,即使私钥被盗取了,没有密码也是无法使用私钥的(相当于多加了一层防护密码)。

如果上面没有设置密码,则会弹窗“确认继续”,选择“是”即可。

就可以看到生成的公钥内容,如下图。
SSH2 - OpenSSH: 指使用 SSH2 协议的 OpenSSH 版本。OpenSSH 是 SSH 协议的开源实现,支持 SSH1 和 SSH2。SSH2 是 SSH 协议的第二个主要版本,它包括对SSH1的改进和扩展,提供更好的安全性和性能。
SSH2 - IETF SECSH: 指 SSH2 的另一种规范,由 IETF(Internet Engineering Task Force)维护。
SSH1: SSH1 是 SSH 协议的第一个版本。然而,SSH1 存在一些安全性问题,因此更推荐使用 SSH2。大多数现代系统和实现都默认使用 SSH2。
我们选择“SSH2 - OpenSSH”,然后点击“保存为文件”,将公钥保存为文件,作为备份,供后面传入到服务器中。
最后,单击“完成”,就完成了密钥对的创建。

这里有个问题:我们只保存了公钥,那私钥去哪里了呢?
在Windows系统中,默认情况下,Xshell工具会把生成的私钥文件存放在:
|
|
%Documents%
:系统默认的文档目录;
7
:Xshell版本,如果是Xshell 6
,则需要把路径值改成6
。
如:C:\Users\admin\Documents\NetSarang Computer\7\SECSH\UserKeys
。
如果实在找不到该目录,可以使用全盘搜索工具Everything
来搜索上面指定的密钥名称,如:id_rsa_2048.pri
。
pri
为private
的简写,意为私钥文件。
实在找不到刚才的私钥文件,也可以在Xshell中使用,因为Xshell软件已经自动导入到Xshell中了,可以直接使用,详见后面的 Xshell使用密钥登录。
使用Linux命令
我们可以使用Linux的ssh-keygen
命令来生成密钥对。
|
|
生成一个 2048 比特的 RSA 密钥对,同时添加了一个注释 “test”(存在于公钥文件中)。
这样就生成了一个密钥对。
如果是root
用户,则会存放于/root/.ssh
文件夹中,私钥文件名为:id_rsa
,公钥文件名为:id_rsa.pub
。
示例如下:

使用密钥对登录
根据前面的原理,我们需要将密钥对中的公钥添加到服务器中,让服务器使用这个公钥对随机产生的一段文本加密。
添加公钥到服务器
在/root/.ssh
目录下,使用vim
命令创建一个名为authorized_keys
的文件。
|
|
将上面生成的公钥粘贴到authorized_keys
文件中。
/root/.ssh/authorized_keys
文件是用于存储授权访问的公钥列表的文件。如果系统有多个用户,每个用户可以在其家目录下的.ssh
文件夹中有一个独立的authorized_keys
文件,用于管理他们的 SSH 访问权限。
当有多个公钥时,每个公钥应该占据文件的一行,如下所示:
|
|
修改SSH配置文件
使用vim
修改/etc/ssh/sshd_config
文件:
|
|
将其中PubkeyAuthentication yes
和AuthorizedKeysFile .ssh/authorized_keys
两项的注释取消(删除前面的#
)。
如果想禁止使用密码登录,就将PasswordAuthentication
设置为 no
。

重启SSH服务
由于我们修改了SSH的配置,所以我们需要重启SSH服务。
|
|
或者使用
|
|
Xshell使用密钥登录
使用Xshell工具,点击“新建会话“,输入”主机“。

然后点击”连接“下面的”用户身份验证“,输入用户名“root”,勾选下面的“Public Key”,单击右侧的“设置”。

选择之前生成的私钥,如果在生成私钥时设置了密码,则这里需要填入之前设置的密码,否则可以忽略。

如果是通过Linux命令的方式生成的私钥,可以新建一个名为“xxx.pri”的文件,将私钥内容粘贴并保存,然后再这里选择“浏览”,将私钥文件导入即可。
设置好私钥之后,点击“连接”按钮,就可以完成SSH的密钥登录了。
附录
非对称加密
非对称加密是一种密码学中的加密方式,它使用一对密钥来进行加密和解密,其中一个是公钥,另一个是私钥。以下是非对称加密的简单介绍:
- 密钥对: 非对称加密使用一对密钥,分别是公钥和私钥。这两个密钥是数学相关的,但不能通过已知公钥计算出私钥。
- 公钥和私钥: 公钥是公开的,可以被任何人获得和使用,用于加密数据。私钥是保密的,只有密钥的所有者知道,用于解密由公钥加密的数据。
- 加密过程: 当发送方想要向接收方发送加密消息时,它使用接收方的公钥对消息进行加密。只有接收方拥有与公钥配对的私钥,才能解密并读取消息。
- 解密过程: 接收方使用其私钥对加密的消息进行解密,从而得到原始的明文消息。私钥是唯一能够解密由公钥加密的数据的密钥。
- 安全性: 非对称加密提供了更高的安全性,因为即使公钥暴露,私钥仍然是安全的。攻击者无法通过公钥推导出私钥,从而保护了加密通信的安全性。
典型的非对称加密算法包括 RSA、DSA(数字签名算法)、ECDSA(椭圆曲线数字签名算法)等。这些算法在不同的应用场景中发挥着重要的作用,确保了数据的保密性、完整性和身份验证。