HTTPS

HTTP安全增强

HTTP安全性不足


  • 数据加密:明文传输,可以窃取
  • 身份认证:不验证通信方身份,可以伪造
  • 完整性保障:无法证明报文完整性,可以篡改,中间人攻击

HTTPS


HTTP+SSL=HTTPS, 在TCP传输层和应用层之间加入安全层
HTTP直接和TCP通信 -> HTTP通过SSL和TCP通信
另有升级版的TLS,基于SSL开发
默认端口443

HTTPS比HTTP慢,消耗更多的服务器资源,适合局部保护敏感信息用

加密细节


加密算法特性

  • 密钥对称加密,同一密钥加密解密。如何安全将密钥发送是个问题
  • 公私钥非对称加密,一对密钥,其中一个加密可用另一个解密,将其中一个作为公钥。公钥无需担心安全问题,发送方用接收方的公钥加密,接收方用自己的私钥解密

非对称加密效率慢,HTTPS采用混合加密提升效率,先使用非对称加密交换密钥,然后使用对称加密进行后续通信

  1. 服务器向认证机构(比如VeriSign)申请公钥证书,机构使用私钥对服务器公钥数字签名并写入证书
  2. 客户端发起请求,告知自己支持哪些加密算法
  3. 服务器确定加密算法和哈希算法并把证书回复给客户端
  4. 客户端用认证机构的公钥(浏览器内置)验证证书的数字签名,提取出服务器公钥
  5. 客户端用服务器公钥加密一个Key发给服务器
  6. 服务器用自己私钥获得Key值
  7. 双发通过Key进行对称加密相互发送报文,全部发送内容都会加密,包扩报文头信息,并且有哈希还会附加MAC(Message Authentication Code)报文摘要,保障完整性

整个过程中,有认证机构公钥和服务器公钥,认证机构公钥内置在浏览器,服务器公钥在认证机构签发的证书里
之所以发认证机构证书,而不是直接发服务器公钥,因为客户端无法区分收到公钥的合法性,容易被掉包

  • 中间人篡改证书
    证书带有数字签名,根据证书内容,可以哈希计算出一个编号,检验是否和证书编号匹配,防止被篡改,因此中间人替换公钥不行
  • 中间人替换证书
    证书内包含域名信息,即使中间人也申请了合法证书,掉包真实证书发往客户端,浏览器会发现域名不匹配,因此如果证书是用域名注册,直接用ip访问同样会被认为不匹配

客户端也可以有证书,但是要付费颁发而且得自行安装,比如银行网银证书
申请证书是有成本的,使用OpenSSL可以自行颁发证书,可以内部使用

HSTS


浏览器默认填充http,一般网站采用跳转定向到https,这个明文交互过程中容易被劫持
HSTS采用Strict-Transport-Security响应头作为返回,包含过期时间和是否包含子域名的标记,存储于浏览器内部,下次访问时浏览器会自动采取https的方式访问

  • 首次访问问题:首次访问依然会发明文,可以申请预先内置于浏览器中
  • 过期问题:每次响应都会包含HSTS头,及时更新刷新过期日期

代理抓包


原理和中间人攻击类似,创造一个合法的代理转发

  • 代理和服务器之间使用正常的服务器证书通信
  • 代理和客户端之间使用代理发的假证书通信
    关键就是让客户端认为代理发的证书也是有效的,方式是安装代理证书到系统信任列表

防抓包


中间人机制抓包是基于客户端信任了假证书,防止策略是证书锁定
客户端内预置一份证书,与拿到的证书对比