学习资源 小林coding 2022.4.1 愚人节快乐!
HTTP 明文传输 客户端与服务器通信的信息是肉眼可见 抓包可以截取通信内容
安全风险:
HTTPS在HTTP与TCP层之间加入了TLS协议 来解决上述的风险
TLS协议是如何解决HTTP的风险呢?
在进行HTTP通信前 需要先进行TLS握手
记录是TLS收发数据的基本单位
多个记录可以组合成一个TCP包发送
通常经过四个消息就可以完成TLS握手 也就是需要2个RTT时延
密钥交换算法:性能问题 双方在加密应用信息时使用的是对称加密密钥
而 对称加密密钥是不能被泄露的 为了保证对称加密密钥的安全性 采用非对称加密的方式来保护对称加密密钥的协商
密钥交换算法
:RSA
传统的TLS握手基本是使用RSA算法来实现密钥交换的
在将TLS证书部署服务端时 证书文件中包含一对公私钥
公钥会在TLS握手阶段传递给客户端 私钥留在服务端 保证私钥不能外泄
RSA算法中 客户端会生成随机密钥 并使用服务端的公钥加密后传给服务端
根据非对称加密算法 公钥加密的信息只能通过私钥解密 服务端加密后 得到共同密钥 加密信息
客户端首先会发送一个Client Hello
消息 跟服务器打招呼
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XziMQ4sc-1648780520002)(https://cdn.jsdelivr.net/gh/xiaolincoder/ImageHost4@main/网络/https/clienthello.png)]
被服务端保留 生成对称加密密钥
服务端收到客户端的Client Hello
消息后 确认TLS版本号是否支持
返回Server Hello
消息
密码套件格式:密钥交换算法 签名算法 对称加密算法 摘要算法
服务端证明身份 发送 Server Certificate
给客户端
服务端发送 Server Hello Done
目的告诉客户端 打招呼完毕
客户端验证完证书之后 认为可信则继续向下走
客户端生成新的随机数 用服务器的RSA公钥加密该随机数
通过 Change Cipher Key Exchange
消息传给服务端
服务器收到后 用RSA私钥解密 得到随机数
至此有三个随机数 分别是
双方根据三个随机数 生成会话密钥 对称密钥 ->用于对后续的HTTP/响应的数据加解密
生成会话密钥之后 客户端发送 Change Cipher Spec
告诉服务端开始使用加密方式发送信息
之后服务端发送 Encrypted Hankshake Message(Finished)
消息 把之前所有发送的数据做个摘要
再用会话密钥加密 服务器验证 验证是否篡改
Change Cipher spec
之前传输的TLS握手数据 都是明文 之后都是堆成密钥加密的密文
同样操作 发送
Change Cipher Spec
Encrypted Hankshake Message(Finished)
如果双方加解密没有问题 握手正式完成
客户端拿到了服务端的数字证书 如何校验证书是真实有效的呢
数字证书包含:
数字证书的作用: 认证公钥持有者身份 防止第三方冒充
证书是用来告诉客户端 该服务器是否是合法的 只有证书合法 才代表服务端身份是可信的
服务端的证书都是由CA 证书认证机构 签名 -> 避免中间人在获取证书时对证书内容的篡改
CA签发证书:
客户端校验服务端数字证书流程:
证书验证过程种 存在证书信任链的问题
CA申请证书 一般不是根证书签发 是由中间证书签发
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXrro1LD-1648780520005)(https://cdn.jsdelivr.net/gh/xiaolincoder/ImageHost4@main/网络/https/baidu证书.png)]
最开始客户端只信任根证书 GlobalSign Root CA 证书的,然后 “GlobalSign Root CA” 证书信任 “GlobalSign Organization Validation CA - SHA256 - G2” 证书,而 “GlobalSign Organization Validation CA - SHA256 - G2” 证书又信任 baidu.com 证书,于是客户端也信任 baidu.com 证书。
证书链: 保证根证书的绝对安全性 将根证书隔离的越严格越好
不支持前向保密
客户端传递随机数给服务器使用公钥加密
服务端收到私钥解密
如果服务器私钥泄露 所有TLS通讯密文都会被破解