HTTP安全增强
HTTP安全性不足
- 数据加密:明文传输,可以窃取
- 身份认证:不验证通信方身份,可以伪造
- 完整性保障:无法证明报文完整性,可以篡改,中间人攻击
HTTPS
HTTP+SSL=HTTPS, 在TCP传输层和应用层之间加入安全层
HTTP直接和TCP通信 -> HTTP通过SSL和TCP通信
另有升级版的TLS,基于SSL开发
默认端口443
HTTPS比HTTP慢,消耗更多的服务器资源,适合局部保护敏感信息用
加密细节
加密算法特性
- 密钥对称加密,同一密钥加密解密。如何安全将密钥发送是个问题
- 公私钥非对称加密,一对密钥,其中一个加密可用另一个解密,将其中一个作为公钥。公钥无需担心安全问题,发送方用接收方的公钥加密,接收方用自己的私钥解密
非对称加密效率慢,HTTPS采用混合加密提升效率,先使用非对称加密交换密钥,然后使用对称加密进行后续通信
- 服务器向认证机构(比如VeriSign)申请公钥证书,机构使用私钥对服务器公钥数字签名并写入证书
- 客户端发起请求,告知自己支持哪些加密算法
- 服务器确定加密算法和哈希算法并把证书回复给客户端
- 客户端用认证机构的公钥(浏览器内置)验证证书的数字签名,提取出服务器公钥
- 客户端用服务器公钥加密一个Key发给服务器
- 服务器用自己私钥获得Key值
- 双发通过Key进行对称加密相互发送报文,全部发送内容都会加密,包扩报文头信息,并且有哈希还会附加MAC(Message Authentication Code)报文摘要,保障完整性
整个过程中,有认证机构公钥和服务器公钥,认证机构公钥内置在浏览器,服务器公钥在认证机构签发的证书里
之所以发认证机构证书,而不是直接发服务器公钥,因为客户端无法区分收到公钥的合法性,容易被掉包
- 中间人篡改证书
证书带有数字签名,根据证书内容,可以哈希计算出一个编号,检验是否和证书编号匹配,防止被篡改,因此中间人替换公钥不行 - 中间人替换证书
证书内包含域名信息,即使中间人也申请了合法证书,掉包真实证书发往客户端,浏览器会发现域名不匹配,因此如果证书是用域名注册,直接用ip访问同样会被认为不匹配
客户端也可以有证书,但是要付费颁发而且得自行安装,比如银行网银证书
申请证书是有成本的,使用OpenSSL可以自行颁发证书,可以内部使用
HSTS
浏览器默认填充http,一般网站采用跳转定向到https,这个明文交互过程中容易被劫持
HSTS采用Strict-Transport-Security
响应头作为返回,包含过期时间和是否包含子域名的标记,存储于浏览器内部,下次访问时浏览器会自动采取https的方式访问
- 首次访问问题:首次访问依然会发明文,可以申请预先内置于浏览器中
- 过期问题:每次响应都会包含HSTS头,及时更新刷新过期日期
代理抓包
原理和中间人攻击类似,创造一个合法的代理转发
- 代理和服务器之间使用正常的服务器证书通信
- 代理和客户端之间使用代理发的假证书通信
关键就是让客户端认为代理发的证书也是有效的,方式是安装代理证书到系统信任列表
防抓包
中间人机制抓包是基于客户端信任了假证书,防止策略是证书锁定
客户端内预置一份证书,与拿到的证书对比
一分也是爱~
版权声明
This site by Linest is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由Linest创作并维护的博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。