得之我幸 失之我命

when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.

ssh 与公私钥(众说纷纭)

公钥登陆的两个步骤更新于 2023.01.25

自从换了工作以来,就离不开与 ssh 打交道,为了登陆方便,公私钥更加是避免不了,总有一天得好奇 ssh 通过公私钥认证登陆的原理,择日不如撞日,趁机把这部分内容找了点资料看了下,记录一下

准备工作:Client 端将自己的公钥手动追加在 Server 端的 authorized_keys 中

公钥登陆的两个步骤:

  1. 会话密钥 (session key) 生成
    • Client 端和 Server 端互相发送 ssh 协议版本以及 openssh 版本,并约定协议版本
    • Client 端和 Server 端互相发送支持的加密算法并约定使用的算法类型
    • Server 端生成非对称密钥,并将公钥以及公钥指纹发送到 Client 端
    • Client 端和 Server 端分别使用DH算法计算出获取会话密钥,后续所有流程都会使用会话密钥加密传输
  2. 认证
    • Client 端将公钥指纹信息 使用上述的 q (会话密钥) 加密发送到 Server 端
    • Server 端接收到 Client 端的连接请求后解密,并去 authorized_keys 中匹配对应的公钥
    • Server 端生成随机数 R,用 Client 端的公钥对该随机数进行加密得到 pubKey®,然后将加密后信息发送给 Client 端
    • Client 端通过私钥进行解密得到随机数 R
    • Client 端对随机数 R 和本次会话的 SessionKey 利用 MD5 生成摘要 Digest1,发送给 Server 端
    • Server 端会也会对 R 和 SessionKey 利用同样摘要算法生成 Digest2
    • Server 端会最后比较 Digest1 和 Digest2 是否相同,完成认证过程

几个小问题:

  • Server 端如何在 authorized_keys 中找到对应的公钥?

    Client 在认证的开始会发送一个公钥的指纹信息(具有唯一性,但不是公钥)给 Server,Server 就是通过该指纹信息在 authorized_keys 进行查找对应的 PublicKey

  • known_hosts 中存的是什么?

    known_hosts 中存的是已认证的远程主机 host key,每个 Server 都有一个 secret, unique ID, called a host key

be slow to promise and quick to perform.