这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
书接上回,我们谈到缺少了身份认证的完整性保护是没有意义的,因为中间人可以整体修改源数据,并产生新的hash值,那么如何实现身份认证呢?
TLS身份验证
TLS身份验证有2个部分:作为“网络身份证”的SSL证书--证明你是你,与证书防伪技术“数字签名”--证明这个证书是真的。
SSL证书
-
SSL证书,也称数字证书,是第三方认证机构Certification Authority发放的,认证机构一般都是受到政府认证和监管的机构,他们管理公钥的整个生命周期,包括:发放证书、规定证书的有效期和必要时废除证书。CA的防伪等级关于到他们的生死存亡,所以浏览器默认信任他们的认证机制;
-
在证书中,最重要的就是发放对象的公钥subject_public_key_info. 域名方需要将自己服务器的公钥提交给CA进行签名防伪,下图详细描述了CA证书的签发流程:
- SSL证书的内容包括:证书序列号(这是证书颁发机构为该证书分配的唯一标识符),授予对象(subject)URI,授予对象的公钥(subuject public key info是证书中最重要的字段),证书序列号,发放机构,签名加密模式,加密时间戳,以及所处的证书链,数字签名等等;
-
下图是我从wireshark截取的真实的服务器发送的certificate消息,与上图的结构一一对应:
-
SSL证书并非独立存在,而是属于证书链(certificate chain),实际上SSL认证机构分为不同等级,一般是三级,最高级的是root Certificate。证书链从根证书开始,每一级证书所标识的对象都要为其下一级证书签名,而根证书自身则由自己签名。客户端在验证证书链时,必须对链中所有证书的数字签名进行验证,直到达到根证书为止,所以整个体系以根CA作为信任点。
-
下图为客户端浏览器中的证书链:
-
上层CA可以而且必须认证下层CA,但下层CA不能认证上层CA。所以服务器不仅要提供自己的CA证书和数字签名,还需要提供一个从root CA到自己的证书链,每个客户端都保存着一个root CA列表,如果服务器提供的root CA不再这个列表中,即不信任。
数字签名
光有SSL证书还不够,这个身份证本身也需要防伪,它使用防伪技术就是“数字签名”,数字签名使用非对称加密技术。
-
非对称加密即公钥-私钥密码对(key pair),公钥public key是公开的密钥,任何人都可以获取,私钥private key是用户独自保管的密钥;
-
公钥更像是一把锁,公钥加密过的数据,只有私钥才能解密;私钥是隐私的,独有的,经常用来做签名,用私钥签名的数据,只有用公钥才能验证;
-
数字签名本质上,是第三方认证机构,使用自己的root私钥,对证书进行加密,这样客户端只有使用root CA的公钥才能解密,从而验证证书是否由根CA认证;
-
TLS数字签名随CA证书一起,由服务器发给客户端,同时告诉客户端使用的hash格式与加密算法
- 接下来客户端要做的,就是在自己的root CA列表中去匹配这个机构,并核对它的公钥,并使用公钥对签名进行解密,解密后会得到一个hash value,将它与自己计算的hash进行比对验证,如果匹配则验证成功,如果不匹配则证书有问题。
完整性+身份认证
结合上一篇所讲的HASH完整性保护,我们整体来看一下TLS的身份验证流程。
TLS身份验证流程总共分为4步:
- 服务器端将CA证书链(附带签名)打包发送给客户端;
- 这一步计算hash是在CA端进行的,服务器端不可见,服务器只是将CA证书发送给客户端;
- 服务器发送TLS消息certificate给客户端,这个截图是上面的第二张图;
- 客户端收到后,先进行指纹验证,确保证书整体的完整性;网上很多材料没有写这一步,是不对的。
- 证书中都带有指纹算法,客户端按照指纹算法计算出hash(指纹),并于本地证书中的hash比对,确保证书整体没有被篡改;
- 证书中都带有指纹算法,客户端按照指纹算法计算出hash(指纹),并于本地证书中的hash比对,确保证书整体没有被篡改;
- 本地证书中的指纹:
- 客户端通过CA公钥对数字签名进行解密,得到hash值,并与自己计算的hash值进行比对,验证签名的真实性;
- 在确定签名可靠之后,我们就可以信任这个证书,最后浏览器核对CA证书内容,URL是否一致,是否过期,还可以通过SCT验证证书状态;
-
假设浏览器的连接被某个钓鱼网截取了,它也可以发一个自己的证书给浏览器,也可以通过之前的3步校验,但是通过对比证书上的URL和我们请求的URL,就能发现这不是我们实际请求的网址。
-
以上就是TLS身份验证和完整性保护的内容,下一篇,我们会讲TLS加密算法,包括DH密码协商,真实的TLS握手流程,感谢阅读,如有不准确或错误请留言指正,我会及时修正
总结不易,请勿私自转载,否则别怪老大爷不客气
欢迎喜欢技术的小伙伴和我交流,微信1296386616
参考资料:
HTTPS精读之TLS证书校验 Lyndon zhuanlan.zhihu.com/p/30655259
HTTPS的数字证书验证原理 MR.Guo blog.csdn.net/liuxingrong…
数字证书、签名到底是什么?这篇文章讲得太好了 写代码的明哥 network.51cto.com/art/202010/…