HTTPS RSA解析
TLS握手过程
(这个地方与Network1中的内容存在一定的重复)
HTTP由于是明文传输,也就是说客户端与服务端通信的信息都是肉眼可见的,随意使用一个抓包工具都是可以截获通信的内容。
窃听风险、篡改风险、冒充风险这三种风险。
SSL/TLS是通过,信息加密:HTTP交互的信息被加密之后,第三方就无法窃听。校验机制:校验信息传输过程中是否有被第三方篡改过,如果被篡改过,则会有警告提示。身份验证,证明真的是该网站。
通常经过【四个消息】就可以完成TLS握手,也就说需要两个RTT的时延,然后通信就是建立了TLS连接。事实上不同的密钥交换算法,TLS的握手过程可能会有不同,在该文章中,我们只介绍RSA密钥交换算法,来看看它的TLS握手过程。
TLS第一次握手:
客户端与服务端在进行完毕TCP/IP协议的三次握手之后,发送一个Hello Server消息,TLS版本信息,支持的密码套件等信息。注意此处包含三个信息,一:随机数,二:密码套件(加密算法等等),三,TLS版本信息
TLS第二次握手:
当服务端收到客户端的消息之后,就会确认TLS版本号是否支持,从密码套件列表中选择一个密码套件,以及生成随机数,之后还会返回证书,来证明自己的身份。值得注意的是,在此处,我们注意到一共发送了四个内容,分别为:TLS版本号,密码套件,随机数,还有证书。其中客户端验证证书是需要通过证书链来进行验证的。
TLS第三次握手:
客户端验证完证书之后,认为可信则继续往下走。接着,客户端就会生成一个新的随机数,用服务器的RSA公钥对该随机数进行加密,服务端收到随机数之后,用之前的三个随机数合并成为一个会话密钥。他是对称密钥,用于对后续的HTTP请求/响应的数据进行加密。客户端将所有的之前的数据做一个摘要,以供服务端验证。通知服务端该用新的对称加密方式。
TLS第四次握手:
同样的操作,服务端也通知客户端改变加密方式。
RSA算法的缺陷:
RSA密钥协商算法最大的问题再约不支持 前向保密。因为客户端传递随机数给服务端时候使用公钥进行加密,服务端收到之后会使用私钥进行解密。一旦服务端的私钥泄漏了,过去被第三方截获的所有TLS通信密文都会被破解。
于是就有了DH密钥协商算法,服务端和客户端个字会生成随机数,并一次作为私钥,然后根据公开的DH计算出各自的公钥,通过TLS握手双方的公钥和自己的私钥算出一个随机数。这个随机数的值就可以作为后续堆成加密算法的密钥。
客户端验证证书:
数字证书和CA机构:
在说校验数字证书是否可信的过程前,我们先来看看数字证书是什么,一个数字证书通常包含了:
- 公钥
- 持有者信息
- CA机构的信息
- 证书认证机构(CA)的信息
- CA对此份文件的数字签名以及使用的算法
- 证书有效期等
为了让服务端的公钥能被大家信任,服务端的证书都是由CA机构签名的,CA就是网络世界中的公安局,具有极高的可信度,所以由他来给各个公钥签名,信任的一方签发的证书,必定也是可信任的。之所以要签名,是因为签名的作用可以避免中间人在获取证书时对证书内容进行篡改。
数字证书的签发和验证流程:
CA签发证书的过程中,如上图左侧部分:首先CA会把持有者的公钥、用途、颁发者、有效期等等信息打成一个包,然后对这些信息进行Hash计算,得到一个Hash值。然后使用自己的私钥对该Hash值进行加密,生成一个Certificate Signature,也就是对证书做了一个签名。最后将其添加到证书中。
证书的验证过程。客户端会使用同样的Hash算法获取该证书的Hash值H1,然后浏览器和操作系统中集成了CA的公钥来解密Certificate Signature内容来得到一个Hash2,将二者进行比较。
如果相同则证明该证书是可信的,如果不相同,则证明是不可信的。
证书链:
事实上,证书的验证过程中还存在一个证书信任链的问题,因为我们向CA申请的证书一般来说都不是根证书签发的,二是由中间证书签发的。
服务端收到 baidu.com 的证书之后,发现这个证书的签发者不是根证书,就无法根据本地已有的证书中的公钥去验证 baidu.com 的证书是否可信。于是,客户端根据 baidu.com 证书中的签发者,找到该证书的签发机构是 “GlobalSign Organization Validation CA -SHA-256-G2”,然后向CA请求该中间证书。
请求到证书后发现 “GlobalSign Organization Validation CA -SHA-256-G2” 证书是由根CA 签发的,由于根CA没有再上级的机构,应用软件就会检查该证书是否已经加载在根证书清单中。如果有,用根证书公钥去验证”GlobalSign Organization Validation CA -SHA-256-G2”的证书,如果验证通过,那么就信任该中间公钥的是可信,中间证书可信之后,再根据中间证书的公钥去获取最底层的证书公钥。