HTTP为什么不安全?
http是明文传输,正是因为这一点导致了三大风险
- 窃听
中间人可以直接获取到通信内容,因为内容是明文
- 篡改
中间人可以篡改报文内容后再发送给对方 - 冒充
中间人可以冒充你想通信的服务器
安全通信的四大原则
- 机密性
- 完整性
- 身份认证
- 不可否认
HTTPS原理
对称加密
定义:
- 加密和解密使用的密钥相同
特点:
- 速度快
- 性能高
HTTPS最终采用对称加密方式。
那么就有了一个很关键的问题:服务器和客户端怎么协商出来这个密钥?如果通过报文传,那么还是会被中间人截获。
这个问题通过非对称加密来解决。
非对称加密
定义:
- 加密和解密使用的密钥是不同的,一把作为公钥,可以公开,一把作为私钥,不能公开。公钥加密的信息只有私钥可以解密,私钥加密的信息也只有公钥可以解密。
这个原理可以帮我们解决上面说的如何协商出来对称加密使用的密钥这个问题。
- 服务端保管好私钥,把公钥下发给客户端(因为公钥可以公开,被截获也没问题)
- 客户端把对对称加密需要用的密钥通过1里面拿到的公钥来加密,传给服务端
- 由于密钥只有服务端有,根据定义中,公钥加密的信息只有私钥可以解密,因此只有服务端可以解密这个被加密过的密钥
- 这样就协商出来对称加密使用的密钥了,就可以通过对称加密来传递信息了
看起来问题解决了,但是还有一个问题:服务端怎么把公钥安全的传递给客户端呢?如果直接传公钥,也可能会被中间人调包
这个问题可以通过数字证书来解决
数字证书
先来看证书是怎么被生成的:
服务端把证书传给客户端之后,客户端验证流程:
- 通过第三方机构的公钥可以解密签名,得到摘要
- 把证书明文使用相同的摘要算法生成摘要
- 对比两个摘要是否相同
如果这时一个假的证书,那么使用第三方机构的公钥是不可以解密成功的。
这里又产生了一个问题:客户端如何安全的获得第三方机构的公钥?
公钥是存在于 CA 证书上,证书被操作系统信任,内置在操作系统上的,无需传输,客户端收到证书之后直接使用证书内置的公钥进行解密即可这个机制实际上保证了收到的证书是有效的,如果通过了验证,说明这个证书是合法的,但是它仅仅是合法的,并不能说明它就是服务端的证书。
客户端除了通过验签的方式验证证书是否合法之外,还需要验证证书上的域名与自己的请求域名是否一致,中间人中途虽然可以替换自己向 CA 申请的合法证书,但此证书中的域名与 client 请求的域名不一致,client 会认定为不通过
到此为止,解决了传输信息前所有的安全问题,可以协商对称加密密钥并且开始传输数据了