一、https/tls原理
HTTPS访问的三个阶段
第一阶段 认证站点
客户端向站点发起HTTPS请求,站点返回数字证书。客户端通过数字证书验证所访问的站点是真实的目标站点。
第二阶段 协商密钥
客户端与站点服务器协商此次会话的对称加密密钥,用于下一阶段的加密传输。
第三阶段 加密传输
客户端与站点直接使用已协商的对称加密密钥传输数据。
以下用一张图描绘CA、站点服务器、客户端之间的交互关系
二、中间人攻击
中间人攻击的几种形式
- 直接抓取报文获得明文信息
- 非法中间加密代理,窃取明文信息
- 留存密文,如果对称密钥泄露,解密历史报文
中间人攻击的防范
1.防范直接获取明文
加密传输报文
2.防范非法中间加密代理
黑客对客户端伪装成服务器,对服务器伪装成客户端,通过非法代理窃取会话数据。上面图示的第一、第二阶段可以防止这种非法代理行为。虽然黑客可以获取站点的证书,伪装成站点服务器接收请求,但黑客没有站点服务器私钥,无法与实现客户端实现密钥交换,不能窃取明文的会话数据。
3.防范解密历史报文(前向安全性)
防范解密历史报文,这种安全防护叫前向安全。早期的HTTPS实现中,客户端将会话密钥通过站点公钥加密后,发送给服务器,服务器用私钥解密。此时如果服务器私钥保管不善泄露,黑客如果留存了历史报文,可以解密获取会话密钥,从而还原历史报文数据。目前通过DH算法保证前向安全。在第二阶段,客户端与服务器只交换少量信息,双方便可独立计算出临时会话密钥用于加密。即使黑客事后获取私钥,也不能计算出会话密钥,从而实现前向安全。
三、FAQ
1.为什么不直接使用非对称密钥加密传输报文?
首先非对称密钥加解密效率低,不如对称密钥,一般使用AES等加密算法。其次前面也提到,只使用非对称密钥加解密不能保证前向安全性。
2.浏览器怎么知道所访问的站点不是伪造的?
浏览器主要依靠数字证书来确认所访问的站点不是伪造的。当浏览器通过https访问站点,站点须返回数字证书。数字证书是CA机构“签发”的电子文件,其中包含使用者信息、站点公钥、颁发者(CA)信息和CA指纹等。假设数字证书是完全可信的,且其中的内容也是不可篡改的。浏览器首先验证数字证书中的使用者(站点)信息与所访问的站点域名是否一致,然后用数字证书中的站点公钥挑战站点服务器,只用拥有私钥的真实站点才能通过挑战。因此可以确保所访问的站点是真实的。
注意:如果验证有问题,浏览器会提示风险访问。
3.为什么数字证书是可信的?
CA机构是可信的,CA本身也包含一个非对称密钥对,私钥用于“签发”的数字证书,公钥发布出去用于验证数字证书。CA使用非对称密钥配合HASH算法保证数字证书可信且不可篡改。CA将使用者信息、站点公钥、有效期等关键信息打包做HASH运算,再将HASH运算结果用CA私钥签名生成指纹。然后将以上全部信息打包成数字证书。黑客没有私钥不可以伪造证书签名,且证书的内容如果被修改,HASH结果就会改变。因此黑客不可伪造或者篡改证书,有效的数字证书是可信的。
4.浏览器怎么知道CA是可信的?
浏览器主要依据客户端操作系统保存的根证书列表判断CA的权威性。如上图,在Windows操作系统中,这个列表放在“受信任的根证书颁发机构存储区”中,这个列表实际上是CA机构的根证书集合,根证书包含CA机构的信息和公钥。只要是这个列表中的CA签发的证书,浏览器就认为可信。微软会动态维护根证书列表,用户需要管理员权限才能向这个列表中加入CA证书。
注:Windows客户端运行在内网中时,若无法联网更新根证书列表,此时可能会出向访问https应用缓慢。
5.为什么有些软件如Fiddler可以还原https报文?
Fiddler是通过中间代理的方式抓取报文,还原https报文的前提是在客户端的根证书列表下加入Fiddler生成的CA根证书。这样Fiddler就成为CA,可以伪造数字证书,伪装成服务器。但是只能用于测试,不能实现真正意义上的窃取数据。
————————————————
版权声明:本文为CSDN博主「shrun」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/oZhuZhiYuan/article/details/106650944