HTTPS协议
# HTTPS协议
https
协议是超文本传输安全协议,经由http
进行通信,利用SSL/TLS
来加密数据包,提供身份认证,保护交换数据的隐私与完整性
http
协议采用明文传输,存在信息窃听,信息篡改,信息劫持的风险,而tls/ssl
具有身份认证、信息加密、完整性校验的功能
他新增的安全层主要是对发起的http
请求的数据进行加密操作和对收到的http
内容进行解密操作
# 介绍一下TLS/SSL
的工作原理特别重要
全称安全传输层协议, 是介于TCP和HTTP
之间的一层安全协议
主要依赖 散列函数hash
对称加密 非对称加密,作用如下
基于散列函数验证信息的完整性
对称加密算法采用协商的密钥对数据加密
非对称加密实现对身份认证和密钥协商
散列函数
hash
- 常用的散列函数有
md5
sha1
sha256
,特点为单向不可逆,对输入数据非常敏感,输出长度固定,任何数据的修改都会改变散列函数的结果,可以用于防止信息篡改并验证数据的完整性 - 特点是在信息传输过程中,散列函数不能防止信息防篡改,由于传输的是明文,中间人可以修改信息后重新计算信息的摘要,所以需要对传输的信息和信息摘要进行加密
- 常用的散列函数有
对称加密
- 加密方法是双方使用同一个密钥对数据进行加密和解密,但是如何保证密钥传输的安全性,密钥可能在通过网络传输的过程中被其他人获取到
- 常见的对称加密有
AES-CBC
DES
3DES
AES-GCM
,通讯方式为一对一 - 对称加密的特点就是一对一,需要共享相同的密码,密码的安全是保证信息安全的基础,服务器和
N
个客户端通信则需要维持N
个密码记录且不能修改密码
非对称加密
- 拥有两个密钥,一个公钥一个私钥,公钥是公开的,私钥是保密的,用私钥加密数据,用公钥才能解密,用公钥加密,只有私钥才能解密,任何想通信的客户端都可以用公开的公钥进行加密,然后我们用私钥进行解密,保证数据的安全,但是缺点是加密过程很慢
- 常见的非对称加密为
RSA
ECC
DH
,客户端之间不能相互解密信息,只能和服务器进行加密通信,服务器可以实现一对多的通信,客户端可以用来验证掌握私钥的服务器的身份
- 特点是信息一对多,服务器只需要维持一个私钥就能和多个客户端进行通信,但是服务器发送出去的信息能被所有客户端解密,计算复杂,加密速度慢
综上所述
tls/ssl
的工作方式是客户端使用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的秘钥。对称加密算法采用协商秘钥对信息以及信息摘要进行加密通信,不同节点采用对称秘钥不同,从而保证信息只能通信双方获取。
# 什么是数字证书特别重要
为了避免中间人攻击,我们采用数字证书
使用一种hash
算法对公钥和其他信息进行加密,生成一个信息摘要,然后让有公信力的认证中心(CA
)用他的私钥对消息摘要加密,形成签名,最后将原始的信息和签名和在一起,称为数字证书,当接收方收到数字证书先根据原始信息用相同的hash
算法生成摘要,使用公证处的公钥对数字证书的摘要进行解密,最后将解密的摘要和生成的摘要进行对比,可以发现得到的信息是否被篡改
最重要的是认证中心的可靠性,一般浏览器会内置一些顶层的认证中心的证书,相当我们信任了他
# HTTPS
的握手过程特别重要
RSA
握手
- 客户端首先发送
client_random
、TLS
版本号、加密套件列表给服务器 - 服务器在接收到之后确认
TLS
版本号,同时发送server_random
、需要使用的加密套件、自己的证书给客户端 - 客户端在收到这些信息之后,首先是会对服务器的证书进行验证,若是验证成功则会用
RSA
算法生成一个pre_random
,且用服务器的公钥(在证书中)加密pre_random
发送给服务器。 - 此时,客户端有了
client_random
、server_random
、pre_random
,它会将这三个参数通过一个伪随机函数计算得出最终的secret
,这个secret
就是它们后续通信所要用的对称密钥。 - 服务器接收到了刚刚用自己公钥加密的
pre_random
之后,用自己的私钥进行解密,得到里面的pre_random
,用和客户端一样的方式生成secret
。 - 之后就用这个
secret
对称密钥加密报文传输。
TLS1.2
的ECDHE
握手
客户端在第一次发送
HTTPS
请求的时候,会把client_random
、TLS
版本号、加密套件列表发送给服务器服务器在接收到之后确认
TLS
的版本号,同时发送server_random
、server_params
、需要使用的加密套件、以及自己的证书给客户端客户端在收到这些信息之后,首先是会对服务器的证书进行验证,若是验证成功则会传递一个
client_params
给服务器- 与此同时客户端会通过
ECDHE
算法 计算出一个pre_random
。其中是传入了两个参数,一个是client_params
,还一个是server_params
。(也就是说:ECDHE(client_params, server_params) = pre_random
) - 这时候客户端就同时拥有了
client_random
、server_random
、pre_random
,它会将这三个参数通过一个伪随机函数计算得出最终的secret
,这个secret
就是它们后续通信所要用的对称密钥。
- 与此同时客户端会通过
而在客户端生成完
secret
之后,会给服务器发送一个收尾消息,告诉服务器之后都要用对称加密,且对称加密的算法是用第一次约定好的。服务器它在接收到刚刚传递过来的
client_params
之后,也会使用和客户端一样的方式生成secret
,并且也会发送一个收尾消息给客户端。当双方都收到收尾消息并验证成功之后,握手就结束了。后面开始用这个
secret
对称密钥加密报文进行传输。
(ECDHE
基于椭圆曲线离散对数,传入的两个参数也被叫做椭圆曲线的公钥)
# ECDHE
握手和RSA
握手又有什么区别
- 生成
secret
(对称密钥)的过程不同。RSA
中是使用RSA
算法生成一个pre_random
并用服务器的公钥加pre_random
发送给服务器,然后各自用伪随机函数生成相同的secret
对称密钥;- 而在
ECDHE
握手中,它没有用到RSA
算法,而是用ECDHE
算法生成的pre_random
,且这个过程中比RSA
多了client_params
和server_params
两个参数。
- 在生成完
secret
之后,ECDHE
握手在客户端发送完收尾消息后可以提前抢跑
,直接发送HTTP
报文,节省了一个RTT
,不必等到收尾消息到达服务器,然后等服务器返回收尾消息给自己,直接开始发请求。这也叫TLS False Start
。 - 最主要的:
RSA
不具备向前安全性,而ECDHE
具有向前安全性
(向前安全性:一次破解并不影响历史信息的性质就是向前安全性)
向前安全性
一句话概括:一次破解并不影响历史信息的性质就是向前安全性。
比如在RSA
握手的过程中,客户端拿到了服务端的公钥,然后用此公钥加密pre_random
给服务端。如果此时有第三方有服务端的私钥,并且截获了之前所有报文的时候,那么它就可以破解这段密文并拿到pre_random
、client_random
、server_random
并根据对应的伪随机函数生成secret
,即拿到了最终通信的对称密钥,每一个历史报文都能通过这样的方式进行破解。它就不具有向前安全性。
但是ECDHE
在每次握手的时候都会产生一个临时的密钥对(也就是client_params
、server_params
),即使第三方有了私钥能破解,但是对之前的历史报文并没有影响。它就具有向前安全性。
# TLS1.3
版本较TLS1.2
的改进
- 强化安全
废除了很多的加密算法,只保留了5
个加密套件。其中最主要的是废弃了RSA
,因为在2015
年发现了PRAEK
攻击,即已经有人发现了RSA
的漏洞能进行破解;而且RSA
不具备向前安全性。
- 提高性能
同时利用会话复用节省了重新生成密钥的时间,利用 PSK
做到了0-RTT
连接。
# SSL
连接断开后如何恢复
一共有两种方法来恢复断开的 SSL
连接,一种是使用 session ID
,一种是 session ticket
。
通过session ID
使用 session ID
的方式,每一次的会话都有一个编号,当对话中断后,下一次重新连接时,只要客户端给出这个编号,服务器如果有这个编号的记录,那么双方就可以继续使用以前的秘钥,而不用重新生成一把。目前所有的浏览器都支持这一种方法。但是这种方法有一个缺点是,session ID
只能够存在一台服务器上,如果我们的请求通过负载平衡被转移到了其他的服务器上,那么就无法恢复对话。
通过session ticket
另一种方式是 session ticket
的方式,session ticket
是服务器在上一次对话中发送给客户的,这个 ticket
是加密的,只有服务器能够解密,里面包含了本次会话的信息,比如对话秘钥和加密方法等。这样不管我们的请求是否转移到其他的服务器上,当服务器将 ticket
解密以后,就能够获取上次对话的信息,就不用重新生成对话秘钥了。
# HTTPS
的特点重要
优点
可以认证用户和服务器 确保数据可以正确发送到客户端和服务端
可以加密传输 身份认证 防止数据在传输过程中被窃取 修改 确保数据安全性
不是绝对的安全,但是大幅增加中间人攻击的成本
缺点
需要做服务器和客户端双方的加密和解密处理,耗费更多服务器资源,过程复杂
握手阶段比较费时,增加页面的加载时间
ssl
证书收费 功能越强大费用越高https
连接服务端资源占用高很多,支持访客稍多的网站需要投入更大成本ssl
证书需要绑定ip
,不能在同一ip
上绑定多个域名
# https如何保证安全重要
先理解对称加密和非对称加密
- 对称加密为通信的双方都使用同一个密钥进行加解密,对称加密虽然简单性能好,但是无法解决首次把秘钥发给对方的问题,易被黑客拦截
- 非对称加密
- 私钥 + 公钥 = 秘钥对
- 私钥加密只能公钥解密 公钥加密只能私钥解密
- 通信之前对方把自己的公钥先发给对方
- 对方拿着公钥加密数据响应对方 等到数据传输到对方,对方再用自己的私钥进行解密
- 安全性高 但是速度慢 影响性能
解决方案
结合两种加密方式 将对称加密的密钥通过非对称加密的公钥进行加密,然后发送出去,接收方通过自己的私钥进行解密,获得对称加密的密钥,然后双方可以使用对称加密进行沟通
但是如果中间人 把互发的公钥换成自己的公钥就可以轻松解密通信双方发送的数据了
所以要有ca
证书,防止中间人攻击
如果中间人篡改了证书,是不是身份证明无效了,这时候需要新的技术,数字签名
数字签名是ca
自带的hash
算法对证书的内容进行hash
得到一个摘要,再用ca
的密钥进行加密,最后组成数字签名,当别人收到证书的时候,用同样的hash
算法再次生成摘要,用ca
的公钥对数字签名解密,得到ca
创建的消息摘要,然后对比可知有没有被篡改
# 题外话:如何在html
中将http
请求转换成https
利用meta
标签把http
请求换为https
:
<meta http-equiv ="Content-Security-Policy" content="upgrade-insecure-requests">