SSH2协议加密与连接过程

最近在做ssh2联动交换机模块,看到libssh2-1.9.0版本对于用户认证有三种不同的方式:

① password(默认)② keyboard-interactive ③ publickey

看代码并不是太理解,所以查询了一番,SSH2通信大致分为两步,以下是对通信过程的简单理解:

生成共享秘钥(加密通道):

1. 客户端先向服务器发起TCP连接。

2. 服务器回复自己所支持的SSH版本,若客户端也支持,则继续。

 3. 双方协商一个公共的加密算法,最终使用的加密法一般由机器上加密法列表的排序决定:客户端加密法列表上出现的第一个服务器端也支持的加密算法,将用于双方加密传输的实现。

4. 采用Diffie-Hellman算法,生成共享秘钥(这一块是重点)

① 客户端发起请求,服务器取两个数P、G ,其中P是一个很大的素数,G是P的一个模p本原单位根(primitive root module p),然后将G和P发送给客户端

客户端C会生成一个不公开的随机数a,计算CKey = G ^a mod P,将CKey发送给服务器。

③ 服务器S会生成一个不公开的随机数b,计算SKey = G ^b mod P,将SKey发送给客户端,同时发送的还有服务器的公钥。

④ 客户端C收到SKey后,计算共享秘钥:K = SKey ^a mod P = G ^(b * a) mod P,同时验证此公钥是否存在自己的known_hosts文件中,若不存在或不一致,则会提示是否确认连接。

⑤ 服务器S收到CKey后,计算共享秘钥:K = CKey ^b mod P = G ^(a * b) mod P。

用户认证:

第一种方式:password

根据前一步生成的共享秘钥,直接输入用户密码进行验证。(一般情况下,若没有特殊指定其他认证方式,默认用此认式)

第二种方式:keyboard-interactive

这个方式是必须启用键盘输入才可以,防止记住密码后直接登录。

第三种方式:publickey

1. 客户端生成一对秘钥:public/private key,并将公钥放到服务器的 authorized_keys 文件中。

2. 客户端发送一个秘钥ID给服务器。

3. 服务器收到之后,会在authorized_keys 文件中查找是否有此ID的公钥, 如果有,则服务器生成一个随机数x,并用客户端的公钥加密后通过加密通道发送给客户端。

4. 客户端收到之后,用私钥解除x,然后在本地为随机数x做MD5哈希,并通过加密通道发送给服务器。

5. 服务器为随机数x做MD5哈希,然后用共享秘钥加密后与客户端发送过来的数做比较,若一致,则认证通过。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

结语:

以上就是我对于SSH2通信的一个大致理解,若有错处,望指出,大家共同进步,谢谢!

主要参考链接:

1. 加密连接过程:理解SSH的加密与连接过程_ZStack上海云轴的博客-CSDN博客_ssh加密

2. Diffie-Hellman算法:Diffie-Hellman密码交换是如何运作的? - 知乎

3. Diffie-Hellman算法:浅析Diffie–Hellman 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 认证,应该怎么办? 您可以尝试以下几个步骤来解决这个问题: 1. 确认您输入的用户名和密码是否正确,注意大小写。 2. 确认您的虚拟机是否已经开启了 SSH 服务,并且允许远程连接。 3. 确认您的本地网络是否正常,可以尝试使用 ping 命令测试网络连通性。 4. 如果您使用的是公共网络,可能会被防火墙拦截,可以尝试更换网络环境或者联系网络管理员。 如果以上步骤都无法解决问题,您可以尝试重新安装 SSH 服务或者重置虚拟机密码。 ### 回答2: 当使用虚拟机进行远程连接时,有时候可能会遇到被SSH协议拒绝密码的情况。这可能是由于以下几个原因: 首先,要确保虚拟机上已经启用了SSH服务。SSH是一种通过加密连接来进行远程登录和文件传输的协议,如果没有启用该服务,则无法进行远程连接。可以通过登录虚拟机的终端,输入命令“sudo service ssh start”启动SSH服务。 其次,需要确认是否输入了正确的用户名和密码。在使用SSH连接虚拟机时,需要输入正确的登录用户名和对应的密码。应该仔细检查输入的用户名和密码是否拼写正确,并确保密码是正确的。 另外,还要确认SSH端口是否被防火墙或其他安全配置所阻止。默认情况下,SSH使用22端口进行通信。如果虚拟机的防火墙或其他安全配置阻止了22端口的访问,远程连接就会被拒绝密码。可以尝试修改防火墙规则或其他安全配置,允许22端口的访问。 最后,还有可能是由于SSH服务配置的安全设置导致的拒绝密码。SSH服务可以进行一些安全设置,例如限制登录次数、禁用密码登录等,这些设置可能会导致密码被拒绝。可以查看SSH服务的配置文件,如/etc/ssh/sshd_config,检查相关设置并进行适当修改。 总结来说,虚拟机被SSH协议拒绝密码可能是因为未启用SSH服务、输入了错误的用户名和密码、SSH端口被阻止或SSH安全设置导致的。需要按照上述方法逐一排查,并进行相应的调整以解决这个问题。 ### 回答3: 当虚拟机远程连接时,如果使用SSH协议连接时被拒绝密码,可能有以下几个原因: 1. 用户名或密码错误:确保输入用户名和密码时没有输入错误,并且区分大小写。密码可能需要在连接之前进行设置,确保连接时使用的密码是正确的。 2. SSH服务未启动:在虚拟机中,SSH服务可能未启动或已停止。需要确认SSH服务是否已正确安装并正在运行。可以通过在命令行中输入`sudo service ssh status`(Linux)或`sudo systemctl status ssh`(systemd系统)来检查SSH服务的运行状态;如果结果显示服务未运行,可以使用`sudo service ssh start`(Linux)或`sudo systemctl start ssh`(systemd系统)来启动SSH服务。 3. 防火墙规则限制:虚拟机的防火墙设置可能阻止了SSH连接。确保在虚拟机的防火墙设置中允许SSH连接,具体方法可以根据虚拟机使用的操作系统和防火墙软件进行调整。 4. SSH配置文件错误:检查虚拟机中SSH的配置文件(一般为`/etc/ssh/sshd_config`),确保没有在配置文件中禁用密码登录。找到`#PasswordAuthentication yes`这一行,确保该行没有被注释掉,并且值为`yes`,若注释掉了将其取消注释。 5. 网络连接问题:确认网络连接是否正常,虚拟机所处的网络是否能够与远程连接的主机通信。可以通过ping命令来测试远程主机是否可以访问。 在解决上述问题后,重新尝试使用正确的用户名和密码进行SSH连接。如果问题仍然存在,建议查看虚拟机的系统日志以获取更多的错误信息,或者咨询相关技术支持人员获取帮助。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值