1.Http是什么
2.什么是https
总结下 :HTTP + 加密 + 认证 + 完整性保护 = HTTPS
3.HTTPS如何进行 加密,认证,完整性保护
我们知道HTTP是明文传输的,就必不可免存在如下问题:
- 重要数据被明文获取
- 通信双方可能被伪冒
- 数据被篡改
一般获取简单数据用于展示的,可能无所谓以上的安全缺陷。但假如涉及类似银行密码的数据,就必须慎重考虑这一点了。
所以能够规避以上缺陷的HTTP就是HTTPS(HTTP Secure)。
1.1 如何做到加密 + 认证 + 完整性保护
我们都知道OSI7层模型,其中HTTP属于应用层协议,HTTP下一层是TCP(传输层协议)。完全性是一个难题,专注于传输速率的传输层协议TCP为了单一职责的理念,自是不会多管闲事去保证安全性而降低自身的传输速率的。
HTTP本身假如要去保证部分数据的安全性而去专注安全性的开发,也是得不偿失。想到这里,很是有一些学java感受到的职责单一、职责分离这样的思想,哈哈。所以应该就是这样,HTTP与TCP之间再加上一层SSL/TLS(Secure Sockets Layer/Transport Layer Security)协议。
图1 截自《图解HTTP》
这样就算是明白HTTP、HTTPS的区别了吗?怎么可能呢?不去搞懂为啥就能安全了、为啥是SSL/TLS这两个什么东西、为啥用TLS而不是SSL?不搞明白这些问题,怎么能安心呢?
2. SSL/TLS是什么
图2 截自wikipedia
上一小节讲到,SSL/TLS是HTTP和TCP之间的中转协议。如图,可知SSL/TLS也是一个应用层的协议。
那么我们可以把SSL/TLS当作一个黑盒子,就像TCP、HTTP,我们知道数据先丢给HTTP,HTTP丢给SSL/TLS加密,然后SSL/TLS丢给TCP传输...诸如此类,其中具体细节,暂先不表。
4. TLS/SSL工作机制
4.1 加密方法
共享密钥方式加密 = 对称加密 = 处理速度较快
公开密钥方式加密 = 非对称加密 = 更复杂,处理速度较慢
共享密钥方式加密只要密钥ok就足够安全,服务器只要把密钥交给客户端,然后通信过程中和客户端使用同一把密钥进行加密解密即可。毕竟是HTTP通信过程肯定是需要速度尽量快才是最好。
Q1:但是共享密钥如何安全地递交给对方?比如服务端如何把共享密钥安全交给客户端?
这时候就需要使用公开密钥方式加密。想用密文和公钥恢复到信息原文是异常困难的,相当于对离散对数进行求值,这不是轻而易举能达到的。(还是没有一个很好的概念,总之这很安全就对了)
发送方使用接收方的公钥对数据进行加密,然后接收方收到密文后使用密钥对数据进行解密。
接上一个问题:通信双方持有对方的公钥,发送共享密钥时使用公钥加密,就不怕共享密钥被获取了。
Q2:公钥毕竟是要发放出去的,如何证明发给客户端的过程中,公钥没有被替换掉呢?假如公钥被替换掉,伪冒者就可以假装成服务端和用户进行通信。
接下来就是数字证书认证机构出场。
HTTPS中,服务端将公钥发给数字证书认证机构进行安全认证并对公钥进行数字签名,完成后公钥和签名组合成数字证书。在和客户端通信时,服务端将数字证书发给客户端,客户端通过第三方安全认证机构发布的公钥(一般会在浏览器开发时,内置在浏览器中)对数字证书上的签名进行验证,假如验证通过,则能证明以下事实:
- 认证该服务器的公钥的机构是真实有效的数字证书认证机构
- 该服务器发过来的公钥是值得信赖的
因为通信双方都需要证明自己发出的公钥真实可靠,所以也就存在两种目的性不同的数字证书:可证明组织真实性的EV SSL证书、用以确认客户端的客户端证书
4.2 工作流程
TCP需要三次握手四次挥手,TLS/SSL也需要握手。