在初学Linux的时候或者第一次使用git的时候一定会出现一种协议叫做ssh,并且不可避免的需要配置ssh协议,但是使用了很久都没有去关注ssh到底是什么?

ssh协议(Secure Shell)

ssh中文名为安全外壳,是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。SSH协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的登录和其他安全网络服务。作为Telnet和其他不安全远程shell协议的安全替代方案。

SSH服务由服务端软件OpenSSH和连接客户端组成(SSH、SecureCRT,xshell等),默认端口是22。SSH是一个守护进程,负责实时监听客户端请求,并进行处理。

ssh是一种应用层协议,它的传输层协议是tcp。

ssh连接流程

ssh协议建立连接的过程为:

  • tcp三次握手
  • ssh协议版本协商
  • 服务器端把公钥发给客户端
  • 加密算法协商
  • 客户端使用公钥对服务器端的密码加密并发送给服务器端
  • 服务器端收到后用自己的私钥解密后得到用户名密码和本地密码对比,验证成功允许登录,否则需要客户端再次输入密码验证

这里出现了两次协商,第一次见到协商的时候可能不理解怎么协商,会以为是什么专业名词,但是其实协商的意思。

版本协商

SSH目前包括 SSH1和SSH2两个版本, 双方通过版本协商确定使用的版本。建立连接后,服务端向客户端发送报文(版本标志字符串:SSH-<主协议版本号>.<次协议版本号>-<软件版本号>>)客户端收到报文后,解析数据包,如果服务端的协议版本号比自己的低,且客户端能支持服务端的低版本,就采用服务器端的低版本协议号,否则采用客户端自己的协议版本号。

客户端回应服务器一个报文,包含客户端决定使用的协议版本号。服务端会比较客户端发来的版本号,决定是否能同客户端进行正常工作。

协商成功,就会进入密钥和算法协商阶段,否则服务端断开TCP连接。

算法协商

SSH支持多种加密算法, 在服务端和客户端分别发送算法协商报文给对方后,报文中包含自己支持的公钥算法列表、加密算法列表、MAC(Message Authentication Code,消息验证码)算法列表、压缩算法列表等协商信息。

服务端和客户端根据对方和自己支持的算法列表确定最终使用的算法。

SSH的认证方式

password认证

客户端向服务端发出 password认证请求,然后将用户名和密码加密后发送给服务器;服务器将该信息解密后得到用户名和密码的明文,与自己设备上保存的用户名和密码进行比较,并返回认证成功或失败的消息。


publickey 认证

采用数字签名的方法来认证客户端。目前,设备上可以利用RSA和 DSA两种公共密钥算法实现数字签名。

客户端发送包含用户名、公共密钥和公共密钥算法的 publickey 认证请求给服务端。服务器、端对公钥进行合法性检查,如果不合法,则直接发送失败消息;否则,服务器利用数字签名对客户端进行认证,并返回认证成功或失败的消息。


password-publickey 认证(SSH2.0)

指定该用户的认证方式为 password 和 publickey认证必须同时满足。

说明:客户端版本为 SSH1的用户只要通过其中一种认证即可登录;客户端版本为 SSH2的用户必须两种认证都通过才能登录。


any认证(SSH2.0)

指定该用户的认证方式可以是 password、 publickey中任意一种。