携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
上一篇在总结 HTTPS 时,最后提到了 CA 证书、数字证书以及数字签名等概念,现在就好好聊聊这些都是什么东西,干什么用的。另外,仔细看了一下昨天那篇文章,感觉有关 HTTPS 的原理好像没有解释的很清晰,只放了两张图,下面再提两嘴......
HTTPS 实现原理(SSL 建立连接的过程)
客户端 Client
向服务器 Server
发送请求,连接到Server
的 443 端口,发送的信息主要是随机值1
和客户端支持的加密算法;Server
接收到信息后给Client
响应握手信息,包括随机值2
和匹配好的协商加密算法,该加密算法一定是Client
发送给Server
加密算法的子集;- 然后
Server
给Client
发送的第二个响应报文是数字证书。服务端 Server
必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是,自己制作的证书需要客户端 Server
验证通过才可以继续访问;而如果使用受信任的公司申请的证书,不会弹出提示页面,这套证书其实就是一对公钥和私钥。发送证书,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构、过期时间、服务端的公钥、第三方证书认证机构(CA)的签名以及服务端的域名信息等内容; 客户端 Client
解析证书,这部分工作是由客户端的 TLS
完成的:首先,验证公钥是否有效,比如颁发机构、过期时间等。如果发现异常,会弹出警告框,提示证书存在问题;如果证书没有问题,就会生成一个随机值(预主密钥);客户端 Client
认证证书通过之后,通过随机值1、随机值2以及预主密钥组装成会话密钥
。然后通过证书的公钥
加密会话密钥;- 发送加密信息,这里发送的是用证书加密后的会话密钥,目的就是让
服务端 Server
使用密钥解密得到随机值1、随机值2以及预主密钥; 服务端 Server
解密得到随机值1、随机值2和预主密钥,组装成会话密钥,跟客户端 Client
会话密钥相同;客户端 Client
通过会话密钥加密一条消息发送给服务端 Server
,验证服务端 Server
是否正常接收客户端 Client
加密的消息;服务端 Server
也会通过会话密钥加密一条消息会送给客户端 Client
,如果客户端 Client
能够正常接收的话表明 SSL 层建立完成。
SSL 与 TLS
SSL(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议。SSL 通过互相认证、使用数字签名确保完整性,使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL 记录协议和 SSL 握手协议。
TLS(Transport Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS 记录协议和 TLS 握手协议。TLS 是 HTTP 和 TCP 协议之间的一层,通常 TLS 发生在 TCP 三次握手之后,此时进行 TLS 四次握手,然后再进行 HHTP 通信。
CA 证书
非对称加密
客户端和服务端都有一个公有密钥和一个私有密钥。公有密钥可以对外暴露,私有密钥仅对自己可见。
使用公钥加密的信息,只有对应的私钥才能解开,反之,用私钥加密的信息,只有对应公钥才能解开。这样客户端发送消息前,先用服务端的公钥对信息加密,服务端收到后再用自己的私钥进行解密。
非对称加密优点
- 非对称加密采用公钥和私钥的方式,解决了 HTTP 的消息保密性问题,而且使私钥泄露的风险降低;
- 由于公钥加密的消息只有对应的私钥才能解开,很大程度上保证了信息的来源性以及消息的准确性和完整性。
非对称加密缺点
- 非对称加密时,用接收方的公钥对信息进行加密,公钥是公开的,任何人都可以拿到。如果第三者拿到,第三者可以在客户端与服务器交换公钥的时候,将客户端的公钥替换成自己的,这样服务器拿到的公钥并不是客户端的,而是第三者的公钥,服务器也无法判断公钥来源的正确性。而且,尽管第三者不替换公钥,他也可以截获客户端发来的消息,对信息进行篡改后再用服务器的公钥进行加密,再发往服务器,服务器接收到错误消息也不知道。
- 非对称加密的性能相比较于对称加密会慢上几倍甚至几百倍,比较消耗系统资源。正因如此, HTTPS 将两种加密结合了起来。
数字证书和数字签名
为了应对非对称加密带来的问题,引入数字证书和数字签名。
CA 签发证书过程(下图左边)
- 首先 CA 会把持有者的公钥、用途、颁发者和有效时间等信息打成一个包,然后对这些信息进行 Hash 计算,得到一个 Hash 值;
- 然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;
- 最后将 Certificate Signature 添加在文件证书上,形成数字证书。
客户端校验服务器的数字证书过程(上图右边)
- 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;
- 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 的内容,得到 Hash 值 H2;
- 最后比较 H1 和 H2,如果相同,则是可信赖的证书,反之,认为证书不可信。
CA 认证介入 HTTPS 连接的过程
- 服务器有自己的公钥和私钥;
- 服务器将公钥交给 CA 机构认证,请求一份数字证书;
- CA 认证机构生成证书,颁发给服务器;
- 服务器将带有公钥信息的数字证书发给客户端;
- 客户端生成对称密钥再进行对接。
写的有点多了,主要含是上一篇中 HTTPS 的原理没有涉及太深,补了一点。写下来,发现还是得理解,其实理解了其中的原因,道理很简单。
希望本文能够帮到你,如有错误,望指正!
我向你敬礼啊,Salute!