Linux系统SSH通讯过程详解

Stella981
• 阅读 522

Linux系统SSH通讯过程详解

这篇文章来为大家介绍远程连接 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地址

Linux系统SSH通讯过程详解

可以看到我们在 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.

Linux系统SSH通讯过程详解

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

Linux系统SSH通讯过程详解

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这