HTTP的缺点
- 通信使用明文,内容可能会被窃听
- 不验证通信方的身份,有可能遭遇伪装
- 无法证明报文的完整性,有可能已遭篡改
按照TCP协议族的工作机制,通信内容在所有通信线路上都有可能遭到窥视
明文被窃听有风险 —— 加密技术
按照加密对象来划分
通信加密
HTTP协议中没有加密机制,通过与 SSL (Secure Socket Layer,安全套接层)或者 TLS(Transport Layer Security,安全传输协议)的组合使用,加密HTTP的通信内容。
与SSL组合使用的HTTP被称为 HTTPS(HTTP Secure,超文本传输安全协议)或 HTTP over SSL
内容加密
对报文中传输的内容进行加密(报文首部未加密,报文主体加密处理)
未验证通信方身份,可能遭遇伪装 —— 查明对方的证书
HTTP协议无法确定通信方,SSL可以,SSL使用了一种叫做 证书 的手段,来确认通信方。 证书 由第三方机构颁发,用来证明服务端和客户端的存在
如何证明报文的完整性
请求报文/响应报文在传输途中遭受拦截并且被篡改内容的攻击称为 中间人攻击(Man-in-the-Middle attack, MITM)
最常用的是MD5(单向函数生成的散列值)和SHA-1等散列值校验的方法,以及用来确认文件的数字签名方法。(但是MD5本身同样存在被篡改的风险)
HTTPS = HTTP + 加密 + 认证 + 完整性保护
HTTP是应用层协议(直接和TCP通信),而HTTPS是用SSL和TLS协议代替了HTTP通信接口部分(HTTP和SSL通信,SSL和TCP通信)
加密
对称密钥加密(共享密钥加密)
加密和解密用同一个密钥,最大的问题在于如何将密钥安全的交到客户端手中(密钥被盗,加密就没有意义了)
TLS中有很多对称加密算法可供选择,比如RC4、DES、3DES、AES、ChaCha20等,前三种被认为是不安全的,通常被禁止使用,目前常用的只有AES和ChaCha20。
- AES:高级加密标准,密钥长度可以是 128、192或者256。是DES算法的替代者,参见
非对称密钥加密(公开密钥加密)
私有密钥和公开密钥,公钥加密只能用私钥解密。
在TLS中只有很少的几种非对称加密算法,比如 DH、DSA、RSA、ECC等。其中RSA可能是最著名的一个。相比于RSA,ECC在安全强度和性能上都有明显的优势,160位的ECC相当于1024位的RSA,224位的ECC相当于2048位的RSA。因为长度短,相应的计算量、内存消耗、带宽消耗就会更少,因此可以认为性能更优。
但是,使用非对称密钥加密和解密的操作相比于对称密钥会更加的复杂,运算速度很慢。
混合加密
结合对称加密和非对称加密的优点
HTTPS:混合加密机制——利用公开密钥加密方式获取到共享密钥,用共享密钥加密方式进行通信
服务器的公开密钥如何安全的交到客户端手中?
- 服务器将自己的公开密钥登录到数字证书认证机构
- 数字证书认证机构(CA)用自己的私有密钥对公开密钥部署数字签名,颁发公钥证书
- 公钥证书(服务器的公开密钥 + CA的数字签名)传给客户端,客户端(浏览器厂商通常会在内部植入常用认证机构的公开密钥)用认证机构的公开密钥,验证公钥证书上的数字签名,以确认公开密钥的真实性
- 客户端用随机数产生会话密钥(session key,通常只有16字节或者32字节),用公开密钥加密传输给服务器
- 双方拿到对称会话密钥,使用对称加密
关于证书
前面提到的证书可以看作是 用来确认服务端身份的服务端证书
那么对应的,可以使用 用以确认客户端身份的客户端证书(成本极高,需支付和用户数对等的费用,使用场景例如银行)
由自认证机构颁发的证书成为 自签名证书 (使用openSSL开源程序,每个人都可以构建自己的认证机构,自己给自己颁发证书,该类证书在浏览器访问时会显示“无法确认连接安全性” 或 “该网络的安全证书存在问题”等警告信息)
HTTPS的通信步骤
Client - C Server - S
-
C -> S : 发送Client Hello报文开始SSL通信(支持的SSL版本、加密组件列表) -----------------------客户端开始通信----------------------------------------------
-
C <- S : 发送Server Hello报文应答(支持的SSL版本、加密组件列表,从上一个报文中筛选出来的)
-
C <- S : 发送Certificate报文(公开密钥证书)
-
C <- S : 发送Server Hello Done报文【SSL握手协商部分结束】 -----------------------服务端返回公开密钥证书----------------------------------------
-
C -> S : 发送Client Key Exchange报文回应(包含随机密码串 Pre-master secret ,已使用公开密钥进行加密)
-
C -> S : 发送Change Cipher Spec报文,提示服务器,之后的通信采用 Pre-master secret 进行加密
-
C -> S : 发送Finished报文(包含全部报文段的整体校验值)(协商是否成功,要看服务端能否正确解密此报文) -----------------------客户端生成一个随机密码串Pre-master secret,用前面的公开密钥加密,并且告知服务器后面的报文用Pre-master secret加密----------------------------------------------
-
C <- S : 发送Change Cipher Spec报文
-
C <- S : 发送Finished报文 -----------------------Finished报文交换完毕,到此SSL连接建立完成,可以开始HTTP通信---------------------------------
………………………http通信(HTTP是应用层协议,tcp是传输层协议)……………………
-
C -> S : 发送HTTP请求
-
C <- S : 发送HTTP响应
………………………http通信……………………
-
C -> S : 断开连接,客户端发送close_notify报文
-
C -> S : 发送 TCP FIN 报文断开tcp连接