目录

ssh简介

加密的方式

ssh工作流程

1.版本号协商

 2.密钥和算法协商

产生会话密钥的流程:

认证阶段

基于口令的认证:

基于公钥的认证:免密登录


ssh简介

ssh: secure shell protocol 安全的壳程序协议。ssh会对我们的传输进行加密。

提供了两个服务: ssh远程登录的服务,sftp传输文件的服务

加密的方式

1.对称加密:使用同一个密钥进行加密和解密

有一个密钥key,加密的数据 name=user password=123456. 使用key对name和password进行加密

对方使用key对name和password进行解密 拿到解密后的真实数据。

ssh 传输设置加密算法_ssh

 对称加密的特点:对称加密的加密强度高,很难破解。

但在实际应用中面临一个非常棘手的问题:如何安全的保存密钥?

2.非对称加密:指的是有一对密钥(公钥和私钥):使用公钥对数据加密,加密之后只能私钥去解密。

ssh 传输设置加密算法_ssh_02

 1.远程Server收到Client端用户TopGun的登录请求,Server把自己的公钥发给用户。
2.Client使用这个公钥,将密码进行加密。
3.Client将加密的密码发送给Server端。
4.远程Server用自己的私钥,解密登录密码,然后验证其合法性。
5.若验证结果,给Client相应的响应。
私钥是Server端独有,这就保证了Client的登录信息即使在网络传输过程中被窃据,也没有私钥进行解密,保证了数据的安全性,这充分利用了非对称加密的特性。

ssh进行连接的时候会使用到: 加密算法,密钥交换算法,完整性校验

ssh中是如何应用的加密方式:ssh即使用了对称加密又使用了非对称加密。

非对称加密时在认证用户连接的时候使用的,对称加密是在用户连接之后开始传输数据的时候加密数据的

ssh工作流程

1.版本号协商

启动了sshd服务之后,服务会默认监听22号端口
客户端向服务发起tcp请求,请求的是22端口,然后三次握手建立连接
服务器向客户端发送第一个报文:SSH-<主协议版本号>.<次协议版本号>.<软件版本号>
#ssh主要有两个版本: ssh1和ssh2
客户端收到报文后比较版本,然后选择合适的版本
客户端回应服务器使用哪个版本

 2.密钥和算法协商

服务器和客户端分别发送自己的算法协商报文:公钥算法列表,加密算法列表,MAC(消息验证码),算法列表,压缩算法列表
客户端和服务器选择都支持算法
服务器和客户端利用DH交换算法、主机密钥对等参数,生成会话密钥和会话ID(客户端和服务端各自计算出来)
# DH算法,会话密钥,会话ID  =》 重要了解的
# DH算法:客户端和服务器会利用这个算法计算出一个key,不是互相传输的
# 会话密钥: ssh连接成功之后,使用对称加密对传输的数据进行加密, 使用加密的密钥就是会话密钥。
# 会话ID: ssh断开连接,现在要恢复连接,通过会话ID来确认是不是上一次的连接

所以每一个新的ssh连接的时候,都会产生新的会话密钥和会话ID:每次是计算出来的可以保证一定的安全性。

最终的结果就是客户端和服务器都掌握了会话密钥和会话ID:进行传输数据的时候就可以使用会话密钥进行加密和解密

产生会话密钥的流程:

1>客户端去请求服务器,服务器会将自己的公钥发送给客户端。

服务器的公钥是如何产生的: 由sshd服务生成一对密钥(公钥和私钥),公钥发送给客户端,私钥服务器自己保留。

2>服务器生成会话ID,发送客户端

服务器发送了服务器的公钥以及会话的ID给客户端

3>如果客户端使第一次连接到ssh服务器,客户端会将服务器的公钥数据记录到自己家目录下./ssh/known_hosts文件。

客户端掌握了服务器端的公钥,会话ID

4>进行密钥交换:DH交换算法

认证阶段

进行ssh连接:两种方式

ssh 传输设置加密算法_ssh 传输设置加密算法_03

 

有一个很重要的问题就是:如何确认服务器是安全的,是你想请求的服务器。

如果有一个黑客冒充了服务器:他也会给你发送公钥, 你把自己的密码使用黑客的公钥进行加密,发送给了黑客

那黑客就使用自己的私钥进行解密。黑客就拿到了你的密码。

ssh 传输设置加密算法_ssh_04

解决这个问题:要确保我请求的就是服务器而不是黑客,拿到就是服务器的公钥而不是黑客的公钥

基于口令的认证:

服务器把这个问题抛给客户端,让客户端去确认现在连接正确性。

无论你请求的是服务器还是黑客,它都给你返回公钥,客户端手动的去确认你是否信任这个公钥,如果信任你就去连接,如果不信任就断开连接。

The authenticity of host '192.168.233.168 (192.168.233.168)' can't be established.
# 无法确定主机“192.168.233.168(192.168.233.168)”的真实性
# ECDSA 密钥指纹是SHA256:Z7G3sGilzvwTMzHy7s6AkzzeHjUYmYCp/JD9nFvimmw.
# 没有直接返回公钥,而是对公钥进行hash,返回hash值
ECDSA key fingerprint is SHA256:Z7G3sGilzvwTMzHy7s6AkzzeHjUYmYCp/JD9nFvimmw.
# 是否确定要继续连接
Are you sure you want to continue connecting (yes/no/[fingerprint])?
如果信任这个公钥,你就输入yes
如果不信任, 你就输入 no
Warning: Permanently added '192.168.233.118' (ECDSA) to the list of known hosts.
# 警告:永久添加192.168.233.118 到已知主机列表中 ~/.ssh/known_hosts
每当客户端第一次使用ssh连接这个ssh服务器,它都会给你提示这个
如果输入yes进行连接,他会将公钥写入用户家目录./ssh/known_hosts文件中
等到下一次你连接的时候,就不会再出现上面的提示,因为会比较./ssh/known_hosts中有没有当前公钥的信息。如果有就直接进入输入密码
如果没有就提示。

客户端确认了公钥是受信任的之后:输入密码之后的流程。

ssh 传输设置加密算法_运维_05

基于公钥的认证:免密登录

  1. 客户端要首先生成一对密钥(公钥和私钥)
  2. 把客户端的公钥需要你手动放到服务器上面(要手动的放到服务器,首先得知道这个服务器)
    这里就已经确保服务器是可信的。放到服务器的用户家目录的~/.ssh/authorized_keys
  3. 客户端请求服务器
  4. 服务器收到客户端的请求之后,先生成随机数random_server, 使用客户端放在authorized_keys这个文件中的公钥对随机数进行加密
    pubkey(random_server)发送给客户端
  5. 客户端有公钥和私钥,客户端收到这个加密的数据pubkey(random_server), 客户端使用私钥进行解密拿到random_server
    使用MD5(hash) 对random_server和sessionkey(会话密钥,在密钥交换步骤产生的)加密形成一个摘要digest1
    发送给服务器
  6. 服务器接收到digest1, 然后服务器本身自己使用之前协商过的MD5算法,自己也知道random_server, 也知道会话密钥sessionkey
    也是使用MD5算法对random_server sessionkey进行加密形成摘要digest2,最后去比较digest1 和 digest2是否相等
    如果相等,登录成功,如果不相等,登录失败。

ssh 传输设置加密算法_ssh_06