HTTP
HTTPS
加密方式:
采用对称加密和非对称加密结合的混合加密:
- 对称加密(AES):只是用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换。(建立完SSL/TLS连接之后,全部使用对称加密的方式加密明文数据)。
- 非对称加密(RSA、ECDHE(为了防止私钥泄漏)):使用两个密钥:公钥和私钥,公钥可以任意分发而私钥保密,解决了密钥交换的问题但是速度慢(主要用途就是交换密钥)。
补充:
- 公钥加密,私钥解密。目的是保证内容传输的安全。因为公钥加密的内容,其他人是无法解密的,只有持有私钥的人,才能解密出实际的内容
- 私钥加密,公钥解密。目的是保证消息不会被冒充。因为私钥是不可泄露的,如果公钥能正常解密出私钥加密的内容,就能证明这个消息来源于持有私钥身份的人发送的
HTTPS的应用数据是如何保证完整性
TLS协议分为 握手协议 和 记录协议
握手协议:TLS 四次握手的过程,负责协商加密算法 和 生成对称密钥,后续用此密钥来保证应用程序数据;
记录协议:负责保护应用程序数据并验证其完整性和来源 {
1、消息被分割成多个较短的片段,然后分别对每个片段进行压缩
2、经过压缩的片段会被加上 消息认证码(MAC 值,通过 Hash 算法生成),为了保证完整性并进行数据的认证。通过附加消息认证码的 MAC 值 ,可以识别出篡改。与此同时,为了防止重放攻击,在计算消息认证码时,还加上了片段编码
3、通过对称加密,加密压缩的片段再加上消息认证码
4、经过加密的数据再加上由数据类型、版本号、压缩后的长度组成的报文就是最终的报文数据
}
SSL/TLS协议基本流程:
SSL/TLS的【握手阶段】涉及 四次 通信:
- 客户端发送请求,包含TLS的版本号、支持的密码套件列表(用于生成随机数)、生成的随机数。
- 服务器响应请求,确定TLS的版本号是否支持、从密码套件列表中选择一个套件生成随机数、数字证书。
- 客户端验证证书后,发送请求包含产生新的随机数,通过证书里面的公钥加密随机数。
- 服务器响应请求,通过私钥进行解密,一共得到三组随机数。通过对称加密生成会话密钥(对称密钥),之后的交互就使用这个会话密钥进行加密解密。
- 客户端、服务器分别发送两种请求:告诉对方开始使用会话密钥进行加密发送消息,将所有发送的信息进行摘要,再通过会话密钥加密之后进行验证是否被中途篡改过。
- 之后就用会话密钥进行加解密HTTP请求和响应了。
CA流程
- 服务端生成公钥和私钥,CA生成公钥和私钥,并把CA的公钥存放在浏览器或者操作系统中;
- 服务端向CA发送公钥,CA用私钥对服务端的公钥进行加密生成数字证书,并颁布返回给服务端;
- 客户端收到服务端响应的数字证书,开始验证,使用CA的公钥对数字证书进行解密(双向的,也就是公钥可以解密私钥),得到服务端的公钥,并使用其对随机数进行加密发送;
- 服务端收到用私钥对其进行解密。
CA签发证书:
- 首先CA 会把持有者的公钥、用途、颁布者、有效时间等信息打成一个包,然后对这些信息进行Hash计算,得到一个Hash值
- 然后CA 会使用自己的私钥将该 Hash 值加密,生产 Cerificate Signature ,也就是 CA 对证书做了签名
- 最后将 Certificate Signature 添加在文件证书上,形成数字证书
客户端校验服务端端数字证书:
- 首先客户端会使用相同的 Hash 算法获取该证书的 Hash 值 h1
- 通常浏览器和操作系统中集成了 CA 的公钥解密 Certificate Signature 内容,得到一个 Hash 值 h2
- 最后 h1 和 h2,如果值相同,则为可信赖的证书,否则认证该证书不可信
解释
密码套件包含:密钥交换算法(RSA)+签名算法+对称加密算法(AES)+摘要算法。
数字证书的作用就是用来认证公钥持有者的身份,防止冒充。
数字证书的由来:
- TLS证书部署服务器时,证书文件中包含一对公钥和私钥。服务器将自己的公钥注册到CA(数字证书认证机构)、CA用自己的私钥将服务器的公钥数字签名并颁发数字证书。
- 同时CA也有可能不直接颁发证书,而是通过证书链来实现。原因在于:为了保证根证书的绝对安全性,将根证书隔离地越严格越好,不然根证书如果失手了,整个信任链都会有问题。通常浏览器和操作系统中集成了CA的公钥信息。
验证证书:从浏览器和操作系统中的CA获取公钥信息、与服务器发送的数字证书里面的公钥信息进行比对,证明数据证书的可信性。
总结
- 就是想使用对称加密的方式进行加密,但是只有一个密钥无法做到安全交换,所以需要非对称加密实现密钥的交换问题,也就是客户端和服务器都获得一样的密钥。
- 所以TLS的前两次握手为了:传输并保存彼此的随机数、验证是否支持TLS协议、传递密码套件明确加密算法。(感觉有点像初始化的意思)
- 客户端验证证书,同时使用证书里面的公钥对随机数进行加密,服务器使用私钥进行解密,一共获得三组随机数,将三组随机数进行对称加密。获取会话密钥,以后请求和响应就用这个会话密钥。
- 最后客户端、服务器分别发送两种请求为了:告诉对方开始使用会话密钥加密,同时验证所有发送信息的安全性。