HTTPS加密(SSL)

HTTPS加密(SSL)

基本原理

image-20210710152700896

1.客户端向服务端发送https请求,即输入网址后,链接到服务器的443端口

2.在服务端(如果采用https协议的话)就必须要有一套数字证书,这个证书其实就是一对公钥和私钥。

3.客户端请求完后,服务端会向客户端发送一个证书,也就是一个公钥,这里称作公钥A,里面还包含许多其他东西,如颁发的机构,过期时间等。

4.客户端解析证书,这部分工作由SSL/SLS实现,如果认证成功了,就会在客户端自己这生成一个随机数,然后用公钥A,对随机数进行加密,这个加密后的结果只有服务端可以解密。

5.客户端收到这个加密信息后可以用自己的私钥解密,得到随机数,目的就是让只有客户端服务端知道这个随机数,随后就用这个随机数进行对称加密

6.然后客户端将内容和私钥(随机数)通过某种算法混合在一起后,这样只有知道私钥才能获取内容,而只有客户端和服务端知道这个私钥

7.客户端收到信息后,解密得到内容。

SSL/TLS


HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,也就是说HTTPS其实有两部分构成,一部分是http另一部分是SSL/TLS,就是在http上面加上了一层处理加密信息的模块。

SSL/TLS握手过程

客户端发出请求

客户端向服务器端发出加密请求,提供信息如下

(1) 支持的协议版本,比如TLS 1.0版。

(2) 一个客户端生成的随机数,稍后用于生成"对话密钥"。

(3) 支持的加密方法,比如RSA公钥加密。

(4) 支持的压缩方法。

ClientHello抓包示例

Ramdom表示客户端生成的随机数

Session ID:如果该客户端第一次连接到服务器,则这个字段为空;如果不为空说明在这之前连接过服务器,通过验证之后,服务器会用这个Session ID 去映射对称密钥,这种情况下不需要ssl握手

Cipher Suites :加密套件,指客户端支持的加密方式

Compression:压缩方法,为了减少带宽可以进行压缩。

服务端回应

服务端收到客户端请求后,回应信息

(1) Version: 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。

(2) Random:一个服务器生成的随机数,前4个字节表示服务器的Unix纪元时间,后面加上28字节的随机数,稍后用于生成"对话密钥"。

(3) Cipher Suite:确认使用的加密方法

(4) Session ID:用于和Server hello 一起发送到客户端,客户端可以把这个字段写入自己的session id里面,下次连接的时候,就不用ssl握手了

Server Hello抓包示例

image-20201104193031442

Certificate抓包示例

由服务器向客户端发送X.509证书

证书里面包含公钥,公钥用来给客户端用来验证的时候加密使用

image-20201104193858083

ServerDone抓包示例

image-20201104194258400

该消息表示服务器已经将所有信息发送完毕,接下来等待客户端的消息。

客户端回应

客户端收到服务端回应后,首先要验证服务端给过来的数字证书,如果证书不是可信机构颁布、或者证书中的域名与实际域名一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。

如果证书没有问题,客户端就会从证书中取出服务器的公钥。

Client Key Exchange抓包示例

image-20201104194456133

(1) 根据之前从服务器端收到的随机数,按照不同的密钥交换算法,算出一个pre-master,发送给服务器,服务器端收到pre-master算出main master。

(2) 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。

(3) 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

服务端最后回应

服务端收到随机数后,计算生成本次回话所有的“会话密钥”,然后发送下列信息

(1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。

(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

应用数据传输

在所有的握手阶段都完成之后,就可以开始传送应用数据了。应用数据在传输之前,首先要附加上MAC secret,然后再对这个数据包使用write encryption key进行加密。在服务端收到密文之后,使用Client write encryption key进行解密,客户端收到服务端的数据之后使用Server write encryption key进行解密,然后使用各自的write MAC key对数据的完整性包括是否被串改进行验证。

参考文档:https://cshihong.github.io/2019/05/09/SSL%E5%8D%8F%E8%AE%AE%E8%AF%A6%E8%A7%A3/

https://xz.aliyun.com/t/2531

SSL剥离(SSL Strip)

在日常上网过程,我们更倾向于直接使用www.example.com去访问网站,不去添加http/https协议头

浏览器会默认添加http:// 头部,如果这时候这个example网站是使用Https协议

则会发送302重定向状态码一个HTTPS的跳转网址

然后浏览器重新请求,因为过程中存在一次不安全http请求,所以存在漏洞

攻击者干预了 HTTP 到安全 HTTPS 协议的重定向,并拦截了用户到服务器的请求。 然后,攻击者将继续在自己和服务器之间建立 HTTPS 连接,并与用户建立不安全的 HTTP 连接,充当它们之间的 “桥梁”。

image-20201105090606625

参考文档:https://learnku.com/security/t/42552

什么是HSTS?

HSTS(Http Strict Transport Security)是一种web安全协议

作用在于在本地强制客户端(如浏览器)使用HTTPS与服务器创建连接

它的基本机制是在服务器返回的响应中,加上一个特殊的头部,指示浏览器对于此网站,强制使用 HTTPS 进行访问

Strict-Transport-Security: max-age=31536000; includeSubdomains; preload

https://juejin.im/post/6844904128146046983 一文带你了解中间人攻击和HSTS

posted @ 2021-07-10 15:28  cjz12138  阅读(813)  评论(0编辑  收藏  举报