签名密钥从数字证书有效期验证,根证书验证,CRL验证其合法性。服务器下发一串用于签名的密钥,通常是一串字符串,客户端需要将发送的数据按照一定的规则,结合密钥得到一个用于签名的字符串,并发送给服务端,服务端根据发来的数据和密钥用同样的方式生成签名和客户端的签名进行比对,如果一致,则认为数据是合法的否则认为数据不合法。
密钥的概括
密钥是一个巨大的数字,使用对称密码,公钥密码,消息认证码,数字签名等技术都需要密钥。密钥的大小不重要,重要的是密钥空间的大小,密钥空间越大,暴力破解越难,密钥空间大小由密钥长度决定。密码的本质是把较长的秘密抽象成较短的秘密,即密码的安全是密钥的安全。数字签名分为签名过程和验证过程,签名时使用私钥,验证时使用公钥。加密过程刚好相反,加密时使用公钥,解密时使用私钥。
在 《ssh工具,开发者必须有所了解》 这篇文章中,概念性介绍了ssh知识,可对大多数人来说,会使用ssh工具才更有用,比如对我来说,成功登录ssh服务器后,才有动力继续了解其他ssh功能。
ssh登录通常有两种方式,分别是口令验证和密钥对验证,口令登录非常简单,运行 ssh root@localhost,然后输入正确口令后就能成功登录。
可你知道背后的细节吗?这也是我写这篇文章的目的,ssh协议和tls协议一样,都组合了很多密码学算法,用于解决网络安全问题,掌握ssh协议的原理对于理解密码学很有帮助,密码学算法有很多,比如AES对称密钥算法,公开密钥算法(DH密钥协商算法,RSA非对称加密算法),MAC算法,Hash算法,如果你大概了解这些算法,理解ssh协议会相对简单一点,否则可能会比较吃力。
了解ssh协议另外一个好处就是,遇到问题的时候就不会慌乱,也能够更安全的使用ssh。
本文先介绍相对简单的ssh口令登录,在介绍之前,先了解ssh协议的三个子协议:
这三个协议中,最后一个相对复杂,本文主要讲解前二个协议。
ssh口令登录主要分为两个阶段,第一阶段是协商出一个会话密钥,在客户端和服务器端之间构建一条安全的通道。第二个阶段在这条通道上验证客户端登录权限。
ssh服务器默认绑定在22端口,监听客户端的请求,在启动的时候会生成一个密钥对(公钥和私钥),一般是RSA算法密钥对,在第一阶段会将公钥发送给ssh客户端,主要让客户端确认ssh服务器端的身份,除了这个作用,我 目前 没有看到这个密钥对还有其他作用。
为什么说“目前”呢?因为我并没有看 ssh rfc 文档,是通过 wireshark 抓包了解 ssh 协议的,从概念性上 猜测 ssh协议原理。
先上一张图,看看ssh登录产生了那些包,大家可以wireshark抓包,然后过滤出ssh包(不看 tcp 包):
其中红线就是ssh登录的第一阶段,该阶段一般输入 ssh root@localhost 就能产生。
另外蓝色就是ssh登录的第二阶段,输入口令后就会产生这些包。
接下去我们先介绍第一个阶段发生了什么:
1:客户端首先发送一个连接请求(序号4),告诉服务器端它目前支持的ssh版本号。
2:服务器端也响应ssh版本号,双方一般协商出的版本号是 ssh v2
3:客户端初始化连接(序号9),进行密钥交换,告诉客户端其支持的各类算法,如下图:
4:然后服务器端也告诉客户端其支持的各类算法(序号10),最后协商出一致的算法,并发送服务器公开密钥对的公钥。
5:如果第一次ssh登录,ssh客户端会提示用户确认服务器公开密钥对公钥的指纹(即公钥的md5值),当然这个在网络包中是体现不出来的。
如果你第一次ssh登录,会出现下图:
如果你确认该指纹就是你想连接ssh服务器的,那么就会将公钥保存到 ~/ssh/known_hosts 文件中,下一次你再登录的时候,ssh客户端发现指纹和ssh服务器发送的指纹是一致的,就不会再让你确认了。
指纹非常重要,后面我会再说。
6:客户端接下去就是要发送 DH 算法密钥对的公钥了(序号13),注意这个密钥对和服务器公开密钥对不是一回事
不管是客户端还是服务器端,各自保留自己的 DH 密钥对的私钥,并将自己的 DH 密钥对的公钥发送给对方,这样双方就会协商出最终的会话密钥(用于对称加密)。
DH 算法就不多描述了,有兴趣可以看看我的书《深入浅出>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)