Linux系统SSH通讯过程详解

SegmentFault

共 3178字,需浏览 7分钟

 ·

2021-01-15 21:21


作者:码农先锋
来源:SegmentFault 思否社区




这篇文章来为大家介绍远程连接 Linux 服务器,一般使用 Linux 系统的人都习惯借助第三方远程连接,因为直接在 Linux 系统内操作很不方便,它不能进行上拉页面,这就很让人难受。可以远程连接的软件很多,有 Xshell、putty、CRT 等等,但是我比较喜欢和习惯使用 Xshell。


说到远程连接,那不得不说的一个协议就是 SSH 了,SSH 是 secure shell 的缩写,是一个安全远程管理的服务。它是一个建立在应用层上的安全远程管理协议,算是目前较为可靠的一个传输协议,专门为远程登陆会话和其他网络服务器提供安全性,利用 ssh 协议可以有效防止远程管理过程中的信息泄露问题。这个协议可用于大多数的 UNIX 操作系统中,它能够实现字符界面的远程登录管理,它默认使用 22 端口,采用密文的形式在网络中传输资源,相对于通过明文传输的 Telnet 协议,具有更高的安全性。


SSH 提供了基于账户密码(口令)和密钥对两种登陆验证方式,这两者都是通过密文传输数据的。


账户密码验证过程:


  1. Client → Server:连接请求
  2. Server → Client:发送公钥
  3. Client → Server:用公钥将密码信息加密,发送
  4. Server → Client:用密钥解密并验证消息,信息合法则建立连接通讯账户密码登录认证过程中传输的是用户的账户名和密码,密码具有足够的复杂度才能具有更高的安全性。

Linux 主机之间的远程管理工具是 ssh 命令,所有我们直接使用 ssh 进行远程登录。

格式:ssh 用户名@IP 地址

ssh root@192.168.88.20

密钥对验证过程:

  1. Client → Server:发送连接请求,并将公钥发送;
  2. Server → Client:验证本地公钥和发送过来的公钥,如果两钥相同,生成一段 challenge 并将公钥加密,回送 ;
  3. Client → Server:用私钥解密,再 challenge 返回给服务器
  4. Server → Client:验证两端 challenge,相同则建立连接

首先需要在 Client 上创建一对密钥,并且要把公钥放在需要访问的 Server 上;当 Client 需要连接 Server 时,Client 端的软件就会向 Server 端发出登录请求,请求使用密 钥对中的公钥进行安全验证;Server 收到请求之后,会在该用户的家目录下查询公钥文件,拿 Client 发送过来的公钥和自己家目录下的公钥进行比较;如果两个公钥一致,server 就会用公钥加密 “challenge(质疑)”,并把它发送给 Client 软件。Client 收到加密内容之后,使用本地的私钥进行解密,再把解密结果发送给 Server 端,Server 端验证成功后,允许登陆。

注意:若对比结果失败,则 Server 端会通知 Client 端此公钥未在本机注册,无法验证登录。



关于用户名密码验证登录


Linux 主机之间的远程管理工具是 ssh 命令,所以我们直接使用 ssh 进行远程登录。

格式:ssh 用户名@IP地址


可以看到我们在 client 主机上远程登录 server 端,是很容易的,只要知道服务器的密码,就可以完成登录操作。



密钥对验证登录


1. 首先客户端生成密钥对文件


[root@client ~]$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:fl3B1MUmxWWNTdOfad8oOyjGaaU+mas/ayawa4ptiJ8 root@client
The key's randomart image is:
+---[RSA 2048]----+
|             .X@|
|             oo.X|
|             oo+|
|               =.|
|       S     o.o|
|   . . ..... o|
|..   o ..*...o   |
|oo..o . #.. o   |
|.oEo...X=*   .   |
+----[SHA256]-----+

ssh-keygen 是生成密钥对的工具,-t 选项是用来指定加密类型的,此处采用 rsa 加密类型,-b 选项是用来指定密钥对加密长度的。

关于上述生成密钥对时的两个询问解释如下:

询问 1:执行过程中会询问保存位置,一般默认保存在当前用户家目录下的 .ssh/ 目录下;

询问 2:是否对密钥文件进行加密

  • 加密:若加密,则在调用密钥文件时需要先验证密钥的密码,密码正确才能使用密钥文件;
  • 不加密:若不加密,则密钥文件可以直接被调用,整个登陆验证过程无需输入任何密码,即为免密登录;


2. 将公钥文件上传到服务器


这里使用 ssh-copy-id 命令进行公钥的上传。

[root@client ~]$ ssh-copy-id root@.71.74.
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@.71.74.'s password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@.71.74.'"
and check to make sure that only the key(s) you wanted were added.


经过对比客户端和服务端公钥内容相同,可以看到密钥上传成功。密钥上传成功之后,我们尝试在客户端上登录服务器:


可以看到,这次登录我们并没有输入密码,直接就登录成功。关于上述演示说明:因为使用的公网服务器进行测试,所以部分敏感地方有做打码,但是这并不妨碍读者阅读,其实这个实验还是蛮有意思的,感兴趣的朋友可以尝试练习。



点击左下角阅读原文,到 SegmentFault 思否社区 和文章作者展开更多互动和交流。

- END -

浏览 44
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报