每日一讲

115 阅读4分钟
  • SSH(Secure Shell Protocol,安全的壳程序协议)它可以通过数据包加密技术将等待传输的数据包加密后再传输到网络上。

  • ssh协议本身提供两个服务器功能:

    • 类似telnet的远程连接使用shell的服务器
    • 类似ftp服务的sftp-server,提供更安全的ftp服务

2.连接加密技术:

  • 对称密钥:使用同一个密钥进行加密发送给对方和对方收到后解密;问题:如何保证密钥的安全

  • 非对称密钥:使用公钥将数据加密,使用私钥对数据进行解密;问题:如何确保服务器的身份(把责任甩给客户端,看客户端是否登录)

11111111111111111
  • 公钥(public key) :提供给远程主机进行数据加密的行为,所有人都可获得你的公钥来将数据加密

  • 私钥(private key) :远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。私钥只有自己拥有

  • SSH在连接的时候使用非对称加密,在传输数据时候使用对称加密

  • SSH工作过程:(在整个通讯过程中,为实现SSH的安全连接,服务端与客户端要经历如下五个阶段)

    过程说明
    版本号协商阶段SSH目前包括SSH1和SSH2两个版本,双方通过版本协商确定使用的版本
    密钥和算法协商阶段SSH支持多种加密算法,双方根据本端和对端支持的算法,协商出最终使用的算法
    认证阶段SSH客户端向服务器端发起认证请求,服务器端对客户端进行认证
    会话请求阶段认证通过后,客户端向服务器端发送会话请求
    交互会话阶段会话请求通过后,服务器端和客户端进行信息的交互
  • 一:版本协商阶段:(client:SSH-2.0-JSCH_FinalShell_214,server:SSH-2.0-OpenSSH_8.0)

    1. 启动了sshd服务之后,服务会默认监听22号端口,客户端向服务发起tcp请求

    2. TCP连接建立后,服务器向客户端发送第一个报文()

      # SSH-<主协议版本号>.<次协议版本号>.<软件版本号>
      # 例:SSH-2.0-JSCH_FinalShell_214
      
    3. 客户端收到报文后,比较本机支持的版本和发送的版本;如果客户端支持发送的版本,客户端回应报文

    4. 服务器收到报文后,也同意;则进入密钥和算法协商阶段,否则服务器断开TCP连接

  • 说明:上述报文都是采用明文方式传输。

  • 二:密钥和算法协商阶段

    • 算法协商:(client:Client: Key Exchange Init,server:serve:Key Exchange Init)

      1. 客户端发送算法协商报文给服务端,报文中包含自己支持的算法。

        # 支持的算法:公钥算法列表,加密算法列表,MAC(消息验证码),算法列表,压缩算法列表
        
      2. 服务端收到的报文得出最终使用的算法,回复客户端。

    • 会话密钥的产生,DH算法:(client:Client: Diffie-Hellman Key Exchange Init,server:Diffie-Hellman Key Exchange Reply, New Keys, Unknown (140,client:New Keys)

      1. 客户端使用适当的客户端程序请求服务器

      2. 服务器会将公钥(由ssh服务计算出的密钥对)和生成的会话ID发送给客户端

        # 密钥对文件/etc/ssh/ssh_host*
        会话ID: ssh断开连接,现在要恢复连接,通过会话ID来确认是不是上一次的连接
        
      3. 客户端生成会话密钥,用服务器的公钥加密后,发送给服务器;服务器用自己的私钥将收到的数据解密,获得会话密钥

        # 如果客户端使第一次连接到ssh服务器,客户端会将服务器的公钥数据记录到自己家目录下./ssh/known_hosts文件
        # 如果是存在记录,则进行对比
        会话密钥: ssh连接成功之后,使用对称加密对传输的数据进行加密, 使用加密的密钥就是会话密钥
        
  • 三:认证阶段

    • 基于口令的认证(password认证):

      1. 客户端向服务器发出用password认证请求,将用户名和密码使用公钥加密后发送给服务器
      2. 服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,
      3. 并返回认证成功或失败消息。
    • 基于密钥的认证(publickey认证)

      1. 手动client发送的公钥保存到Server上登录用户的家目录的.ssh/authorizedkeys文件中
      2. 客户端首先将公钥传给服务器端。服务器端收到公钥后会与本地该账号家目录下的authorized*keys中的公钥进行对比
      3. 如果相同,服务端生成一段随机字符串,并先后用客户端公钥和会话密钥对其加密,发送给客户端。
      4. 客户端收到后将解密后的随机字符串用会话密钥发送给服务器。
      5. 客户端发送的字符串与服务器端生成的字符串的一样,则认证通过,否则,认证失败。