配置SSH密钥登录

SSH登录的方式

SSH(Secure Shell)是一种网络协议,用于在网络上安全地执行命令和传输文件。SSH 的主要目的是通过加密和身份验证来提供安全的远程访问。在 Linux 系统中,使用 SSH 登录可以采用多种方式,其中最常见的是密码登录密钥登录

1.密码登录: 用户通过提供用户名和密码进行身份验证。

2.密钥登录:

  • 用户通过 SSH 密钥对进行身份验证,包括公钥和私钥。公钥存储在服务器上,私钥存储在客户端。
  • 在生成密钥对时可以选择不设置密码。这样,私钥无需密码保护,用户可以直接使用私钥登录。

密钥登录通常被认为更安全,因为它不依赖于密码,而且可以通过禁用密码登录来增加安全性。

常见的SSH工具

有许多 SSH 登录工具可用,常见的有:

OpenSSH:OpenSSHSSH 协议的开源实现,几乎在所有主流的 Linux 发行版中预装。它包含 ssh(用于登录和执行命令)、scp(用于文件传输)和其他相关工具。

Xshell:Xshell 是一款面向 Windows 用户的强大 SSH 客户端,提供了图形用户界面和各种功能。它支持 SSH1SSH2SFTPTelnetRlogin 等多种协议,并具有会话管理、多标签、分屏等功能。有免费版和商业版,商业版提供更多高级功能和技术支持。

FinalShellFinalShell 是一款免费的国产的SSH工具,同时支持WindowsmacOSLinux三个平台。

本文使用的工具为Xshell

密钥登录的原理

密钥登录是一种使用 非对称密钥对 进行身份验证的方式,以下是密钥登录的基本原理:

  1. 密钥对生成: 用户通过非对称加密算法生成一对非对称密钥,包括公钥和私钥。

    • 公钥是公开的,而私钥是保密的。
    • 公钥用于加密数据,私钥用于解密数据。

    如何生成密钥:生成密钥对

  2. 公钥部署到服务器: 用户将生成的公钥提前部署到远程服务器上。

    通常,公钥会添加到服务器上的 ~/.ssh/authorized_keys 文件中,以便服务器能够识别和信任这个公钥。

  3. 连接请求: 用户使用 SSH 客户端发起连接请求到服务器,表明它想要进行身份验证并建立安全连接。

  4. 服务器生成随机字符串,并使用公钥加密: 服务器在接收到连接请求后,会生成一个随机字符串,并使用客户端提供的公钥对该字符串进行加密。这样,只有客户端的私钥才能解密这个字符串。服务器将加密后的字符串发送给客户端。

  5. 客户端解密: 客户端使用自己的私钥对服务器发送的加密字符串进行解密,得到原始的随机字符串,然后将解密后的随机字符串发送回服务器。

  6. 服务器验证: 服务器比较客户端发送的字符串与自己生成的字符串是否一致。如果一致,说明客户端拥有相应的私钥,认证成功。

简单总结:① 生成密钥对 — ② 将公钥保存到服务器 — ③ 用户发送SSH请求,尝试连接到服务器 — ④ 服务器使用公钥加密一个随机字符串,发送到客户端 — ⑤ 客户端使用私钥解密得到原始字符串,返回给服务器 — ⑥ 服务器验证得到的字符串和原始字符串是否一致,若一致,则登录成功。

密钥登录的原理基于非对称加密。服务器使用公钥对生成的随机字符串进行加密,只有拥有对应私钥的客户端才能解密并回传正确的字符串,从而完成身份验证。这种方式相对于传统的用户名和密码登录更加安全,因为私钥通常要比密码更难被破解。

生成密钥对

这里介绍两种方式,一是使用Xshell工具,二是使用Linux命令

使用Xshell工具

打开Xshell客户端,选择“工具”—“新建用户密码生成向导”。

image-20240118171942243

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

image-20240118172230344

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

image-20240118172547915

输入“密钥名称”和“密钥加密密码”,然后点击“下一步”。

密钥名称:可以是任意名称。

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

image-20240118173140955

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

image-20240118174734743

就可以看到生成的公钥内容,如下图。

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”,然后点击“保存为文件”,将公钥保存为文件,作为备份,供后面传入到服务器中。

最后,单击“完成”,就完成了密钥对的创建。

image-20240118174942287

这里有个问题:我们只保存了公钥,那私钥去哪里了呢?

在Windows系统中,默认情况下,Xshell工具会把生成的私钥文件存放在:

1
%Documents%\NetSarang Computer\7\SECSH\UserKeys

%Documents%:系统默认的文档目录;

7:Xshell版本,如果是Xshell 6,则需要把路径值改成6

如:C:\Users\admin\Documents\NetSarang Computer\7\SECSH\UserKeys

如果实在找不到该目录,可以使用全盘搜索工具Everything来搜索上面指定的密钥名称,如:id_rsa_2048.pri

priprivate的简写,意为私钥文件。

实在找不到刚才的私钥文件,也可以在Xshell中使用,因为Xshell软件已经自动导入到Xshell中了,可以直接使用,详见后面的 Xshell使用密钥登录

使用Linux命令

我们可以使用Linux的ssh-keygen命令来生成密钥对。

参考:Linux命令——ssh-keygen

1
ssh-keygen -t rsa -b 2048 -C "test"

生成一个 2048 比特的 RSA 密钥对,同时添加了一个注释 “test”(存在于公钥文件中)。

这样就生成了一个密钥对。

如果是root用户,则会存放于/root/.ssh文件夹中,私钥文件名为:id_rsa,公钥文件名为:id_rsa.pub

示例如下:

image-20240118202923301

使用密钥对登录

根据前面的原理,我们需要将密钥对中的公钥添加到服务器中,让服务器使用这个公钥对随机产生的一段文本加密。

添加公钥到服务器

/root/.ssh目录下,使用vim命令创建一个名为authorized_keys的文件。

1
vim /root/.ssh/authorized_keys

将上面生成的公钥粘贴到authorized_keys文件中。

/root/.ssh/authorized_keys 文件是用于存储授权访问的公钥列表的文件。如果系统有多个用户,每个用户可以在其家目录下的 .ssh 文件夹中有一个独立的 authorized_keys 文件,用于管理他们的 SSH 访问权限。

当有多个公钥时,每个公钥应该占据文件的一行,如下所示:

1
2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC2b7LB3zps0M92Fq6geaaNUGj9Eo3gt3XOn8SZJ1aLFr4+xan0aH+PjykE7HsbsVLkmn9oM5kNmtEKOedU18F8tIgTTqrXamUuO2vTC8Q0jT+5tcmWUn4Gh7ISueZO+fB7p+aYSCl6WDdDXiZw8q1HeV5Z22LnuwYq4pQQXT1lwFJHq/uZatHWSLFO7xZYH2sqmXHhPbkVvGZZj7hmxHGNh8RrB+oGxfUFLv5O7w7F+Q2gVaTg+dsVsMnizihU6/VJmP0gqnpYl/XcDHTD4o9Hf50tQ4Gmwh7JhZwEhMlHjj4UFXWXOs3/XEdY2X2g7Xr5Bfq7CNKc49edQe7k2ow0n+Vc/7U9J+fuBr6sFbElXU77oTNkG+8dX0JxP0lLEbQ6qzXDrSlFJULBRR2o6V/iElFj6b55k+5YLv62PlmcTlM8vDSwYvM3tVg/W2JmbMEtgbfUy8= user1@hostname1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDF3b3vH+bY8mCN7SFTxZDZCVdFae74p+7dpvaEplFzG5gKTtOpBqL9sXCv9hdd+vXYOXXRPYRHQ1oNV6B2d8s9j7bcZESnOqVpTkX4+l15yKF5eLs4vvlhJO5txhwBi4DqCnLMLHHtTOUe25xfjyAlbNxRg4oJS6byk7Qr7XTbSe/c7IfK+eQ1eRC+4enIAnmVkHlfFOuMx8MLcvbzG0OY1CfHJ9Q+W+QDDe6ceah8p89W5OTa6lQGxnvWqecOMweTn+2gH2vnYU+tf4n5WxUzakZDgZJ4p1LBC/YmkC2ISPC3s+ghlUEjTkcsz0uTLcqoXLoDlsTkRvHnDlFVJv3BEX7S0F5J9LbDpUE/LgtNzOY3DQ8IIsyAP14BCjr0ENHbxEFHMlnIjxbOyvq6PVe8N5C5V2w3De3ZGfAE7hQyr5ROBCk5jXmE4I2QdYDR14A43eAD9/yeYgGG/dk61lGLs8jM= user2@hostname2

修改SSH配置文件

使用vim修改/etc/ssh/sshd_config文件:

1
vim /etc/ssh/sshd_config

将其中PubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys两项的注释取消(删除前面的#)。

如果想禁止使用密码登录,就将PasswordAuthentication设置为 no

image-20240118214724218

重启SSH服务

由于我们修改了SSH的配置,所以我们需要重启SSH服务。

1
systemctl restart sshd

或者使用

1
service sshd restart

Xshell使用密钥登录

使用Xshell工具,点击“新建会话“,输入”主机“。

image-20240118221237194

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

image-20240118221204975

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

image-20240118221439331

如果是通过Linux命令的方式生成的私钥,可以新建一个名为“xxx.pri”的文件,将私钥内容粘贴并保存,然后再这里选择“浏览”,将私钥文件导入即可。

设置好私钥之后,点击“连接”按钮,就可以完成SSH的密钥登录了。

附录

非对称加密

非对称加密是一种密码学中的加密方式,它使用一对密钥来进行加密和解密,其中一个是公钥,另一个是私钥。以下是非对称加密的简单介绍:

  1. 密钥对: 非对称加密使用一对密钥,分别是公钥和私钥。这两个密钥是数学相关的,但不能通过已知公钥计算出私钥。
  2. 公钥和私钥: 公钥是公开的,可以被任何人获得和使用,用于加密数据。私钥是保密的,只有密钥的所有者知道,用于解密由公钥加密的数据。
  3. 加密过程: 当发送方想要向接收方发送加密消息时,它使用接收方的公钥对消息进行加密。只有接收方拥有与公钥配对的私钥,才能解密并读取消息。
  4. 解密过程: 接收方使用其私钥对加密的消息进行解密,从而得到原始的明文消息。私钥是唯一能够解密由公钥加密的数据的密钥。
  5. 安全性: 非对称加密提供了更高的安全性,因为即使公钥暴露,私钥仍然是安全的。攻击者无法通过公钥推导出私钥,从而保护了加密通信的安全性。

典型的非对称加密算法包括 RSA、DSA(数字签名算法)、ECDSA(椭圆曲线数字签名算法)等。这些算法在不同的应用场景中发挥着重要的作用,确保了数据的保密性、完整性和身份验证。

0%