目录
第三步,Certificate、Server Key Exchange、ServerHello Done。
第四步,Client Key Exchange、Change Cipher Spec、Encrypted Handshake Message。
第五步,New Session Ticket、Change Cipher Spec、Encrypted Handshake Message。
简介
在学习https中,接触到https(http + ssl)使用混合加密的方式保证通信安全。首先,学习了以下几个概念:
对称密钥加密
通信的双方使用同一个密钥对信息进行加密和解密,优点是加解密速度快,缺点是密钥没法可靠分发(如果密钥可以可靠分发,那消息也应该可以)。
公开密钥加密
使用一对非对称的密钥,私钥保存在本地,公钥可以公开。发送密文的一方使用对方的公钥进行加密,接收方收到后,使用自己的私钥进行解密。优点是解密的私钥不需要进行分发。缺点是加解密速度慢,同时公钥可能被替换。
认证
CA(Certificate Authority),证书授权中心。为了防止公钥被替换,CA提供认证服务。
服务端的工作人员首先会提供自己的公钥给CA进行认证,CA会对服务端的资质等信息进行审核,如信息审核通过,CA 会向申请者签发认证文件-证书。证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。
签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名;
具体流程:
- 客户端 C 向服务器 S 发出请求时,S 返回证书文件;
- 客户端 C 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
- 客户端然后验证证书相关的域名信息、有效时间等信息;客户端会内置信任 CA 的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA 的证书,证书也会被判定非法。
在这个过程注意几点:
- 申请证书不需要提供私钥,确保私钥永远只能服务器掌握;
- 证书的合法性仍然依赖于非对称加密算法,证书主要是增加了服务器信息以及签名;
- 内置 CA 对应的证书称为根证书,颁发者和使用者相同,自己为自己签名,即自签名证书;
- 证书=公钥+申请者与颁发者信息+签名;
HTTPS中的混合加密
简单的说,客户端和服务端首先使用公开密钥加密的方法传输对称加密密钥,为了防止公钥在被替换,服务端会对自己的公钥向CA申请认证,客户端确认了证书后,双发使用对称密钥加密的方法进行通信。下面是图解http中的流程图:
https解决的问题
- 防监听
- 数据是加密的,所以监听得到的数据是密文,hacker看不懂。
- 防伪装
- 伪装分为客户端伪装和服务器伪装,通信双方携带证书,证书相当于身份证,有证书就认为合法,没有证书就认为非法,证书由第三方颁布,很难伪造
- 防篡改
- https对数据做了摘要,篡改数据会被感知到。hacker即使从中改了数据也白搭。
使用Wireshark抓包https
抓的网站是 www.blog.csdn.net ,ping出来的地址是 47.95.47.253, 在Wireshark中筛选出来的结果如下:
第一步,Client Hello。
可以看到,客户端提供了一个随机数(和当前的时间戳和一个随机数有关),后面生产对称密钥有关;一个加密算法列表,供服务器选择。
第二步,Server Hello。
也提供了一个随机数,并且选择了使用一种SHA256算法。
第三步,Certificate、Server Key Exchange、ServerHello Done。
接下来一个一个看。
Certificate,可以看到服务器提供了两个证书,证书包括一长串数字(签名),和一些明文信息,第一个公司就是csdn(域名,行业啥的),第二个是一个提供ssl服务的公司。
Server Key Exchange,使用ECDH(Ellipticcurve Diffie–Hellman)算法交换公钥。
Server Hello Done里没啥,就是告诉客户端,服务器和你hello完了。
第四步,Client Key Exchange、Change Cipher Spec、Encrypted Handshake Message。
客户端使用服务器提出的ECDH算法交换密钥,改变编码,加密握手信息。
第五步,New Session Ticket、Change Cipher Spec、Encrypted Handshake Message。
New Session Ticket:包含了一个加密通信所需要的信息,这些数据采用一个只有服务器知道的密钥进行加密。目标是消除服务器需要维护每个客户端的会话状态缓存的要求。这部分内容在后面的扩展部分会讲到
Change Cipher Spec:编码改变通知。这一步是服务端通知客户端后面再发送的消息都会使用加密,也是一条事件消息。
Encrypted Handshake Message:这一步对应的是 Server Finish 消息,服务端也会将握手过程的消息生成摘要再用秘钥加密,这是服务端发出的第一条加密消息。客户端接收后会用秘钥解密,能解出来说明协商的秘钥是一致的。
到这里双方SSL/TLS握手完成,后面就是用对称密钥加密的消息了。
参考
https://www.jianshu.com/p/a3a25c6627ee
https://www.cnblogs.com/handsomeBoys/p/6556336.html