HTTPS
超文本传输安全协议: Hypertext Transfer Protocol Secure, 是一种网络安全传输协议。在计算机网络上, HTTPS经由超文本传输协议(HTTP)进行通信, 但是利用SSL/TLS来加密数据包。本质就是在TCP运输层和HTTP应用层之间加了一层安全机制。目的是提供对网络服务器的身份认证, 保护交换数据的隐私和完整性。
为何需要HTTPS?
不使用SSL/TLS的HTTP通信, 就是不加密的通信。明文传播会带来风险。
- 窃听风险:第三方可以获取通信内容。
- 篡改风险:第三方可以修改通信内容。
- 冒充风险:第三方可以冒充他人身份参与通信。
HTTPS加密传输使用的加密和HASH算法
非对称加密算法:RSA,DSA/DSS
- 非对称加密: 加密和解密的密钥是不同的, 分为公钥和密钥。
- 私钥只有一份,保存在收信人手中, 不会在通信中传输, 不会被泄露。公钥可以有多份, 保存在写信人手中。
- 假设客户端A要与服务器B进行通信。A用公钥加密, B用私钥解密。
- 即使上述过程中公钥和通信内容都被截获, 由于没有服务器B的私钥, 第三方也无法解开通信内容。
对称加密算法:AES,RC4,3DES
- 加密和解密的密钥是相同的。
- 假设客户端A与服务器B进行通信。A和B用同一个密钥进行加密解密。
- 风险:密钥一旦被截获, 通信内容就能够被破解。
- HASH算法:MD5,SHA1,SHA256
- 使用HASH算法校验内容是否被篡改。
HTTPS握手过程
- 客户端A向服务器B发送HTTPS请求连接。
- 服务器B向客户端A返回数字证书(公钥、域名)。
- 客户端A得到公钥后, 加密自己随机产生的对称密钥。同时通过自己产生的随机密钥加密要传输的通信内容。(这里注意:对称加密算法速度明显快于非对称加密算法, 所以通信内容是用对称算法加密的)。
HTTPS握手过程中发生的事
服务器B返回的数字证书, 客户端A会进行如下验证:
- 遍历计算机和浏览器中保存的根证书, 若其中某个根证书的公钥可以解开服务器返回的数字证书, 获得服务器返回的数字证书中的公钥和域名, 则说明OK。否则握手失败。整个HTTPS通信的核心就是这个可信的根证书。
- 客户端A判断证书中的域名是否和正在访问的域名相同。若不同,显示证书不可信, 但是握手加密过程依然可以进行。
- 客户端产生一个随机的对称密钥。
- 使用服务器B返回的数字证书中的公钥来加密此对称密钥。
- 将此加密后的对称密钥发送给服务器B。服务器B通过私钥解密获得客户端A随机产生的对称密钥。至此客户端A和服务器B都拥有了对称密钥。
- 客户端A通过自身随机产生的对称密钥来加密HTTP通信内容。服务器B可以通过之前得到的对称密钥解密通信内容。
握手过程中涉及到两种证书。
- 服务器B发送给客户端A的证书-用户证书。
- 客户端A所在计算机中原本保存的根证书。
什么是用户证书
- 服务器B发送给客户端A的用户证书, 是服务器B向CA机构(数字证书认证机构)申请而来的证书。
CA机构(数字证书认证机构)
- CA机构有一对根密钥。CA机构会用其私钥加密服务器B的公钥。结果就是:通过CA机构认证的证书(公钥、域名)。
- CA机构说白了就是一个受信任的中间人。
什么是根证书
- CA机构有一对根密钥。其公钥就是根证书。
- 用户的操作系统中,会集成世界范围内所有被信任的CA机构(数字证书认证机构)的根证书。即所有被信任机构的公钥。
- iPhone->通用->关于本机->证书信任设置->进一步了解被信任的证书。可以看到iOS中可用的受信任根证书的列表。
为什么数字证书认证机构呢?
这需要提到中间人攻击。
- 假设客户端A向服务器B发起HTTPS连接请求。那么服务器B就将自己的公钥发送给客户端A。
- 中间人C通过某种手段截获这个公钥B。
- 中间人C截获服务器B发送给客户端A的真公钥后, 伪造一份服务器B的公钥(当然中间人C自己持有了私钥), 中间人C会把伪造的公钥发送给客户端A。
- 客户端A通过伪造的公钥加密自己的对称密钥, 传送给服务器B的时候, 会被中间人C截获, 并且中间人C通过自己手中的私钥解密得到该对称密钥。然后中间人C再把这对称密钥用服务器B的公钥加密, 发送给服务器B。这样AB之间的通信仍然继续。
- 如此一来, 接下来客户端A发送给服务器B的通信内容, 都会在不知情的情况下被第三方得到。AB之间的非对称加密形同虚设。
- 有了根证书就解决该问题了。因为服务器B发送给客户端A的用户证书只能通过根证书来解密获得。确保了用户证书(公钥、域名)真实有效。因为如果是第三方伪造的, 那么根证书将不能解开从服务器B发送来的数字证书, 通信失败。