前言
什么是HTTPS?HTTPS不是新的协议,而是在HTTP协议的基础上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。
随着互联网业务对数据信息安全需求的日益提升,HTTPS的使用也越来越广泛
HTTP协议的缺点
- 明文通信,在任何环节都可以被窃听;
- 没有验证身份,有可能遭到伪装;
- 无法验证报文完整性,通信过程可能遭到篡改;
HTTPS对以上缺点的改进
明文通信被窃听
隐患:不论报文加不加密,在通信的任何过程都可能被窃听到。各种抓包工具(wireshark)和嗅探器就是利用这个原理。
解决:通信加密(HTTPS建立隧道)、内容加密(加密报文主体,不加密请求响应头,而且仍然可能被篡改)
没有身份验证
隐患:伪装的服务器和客户端、没有权限的用户、无法确定请求出处、照单全收各种无意义请求引发DoS攻击
解决:SSL的证书手段
无法验证报文完整性
隐患:通信过程中可能被篡改而引发中间人攻击(MITM)
解决:完整性保护(SSL提供的认证和加密处理、摘要功能)
和HTTPS协议的优势
- 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥
- 数据完整性:内容传输经过完整性校验
- 身份认证:第三方无法伪造服务端(客户端)身份
说白了,HTTPS就是身披SSL外套的HTTP;HTTPS = HTTP+加密+认证+完整性保护
解决内容被窃听的方法
共享密钥:
加密和解密使用同一串密钥的方式。这种方式加密和解密同用一个密钥。加密和解密都会用到密钥。没有密钥就无法对密码解密,反过来说,任何人只要持有密钥就能解密了。
共享密钥的困境:因为在传递过程中密钥可能会被截取利用,而丧失加密的意义。
公开密钥
使用一对非对称性的密钥。公开密钥用于加密,私有密钥进行解密。这样公开密钥被人拿到也没关系,拿到的人只能加密,不知道怎么解密。公开密钥解决了共享密钥的困境。
公开密钥的困境:你并没有办法验证公开密钥本身是不是货真价实的公开密钥。这就要求我们使用公开密钥证书来进行验证。
证书
我们可以拿证书去跟数字验证协会做验证,那这个过程又怎么保证不被攻击呢。多数浏览器在发布版本时会事先在内部植入常用认证机关的公开密钥。
SSL证书按作用分为两种:
- 验证服务器是否规范;
- 确认服务器背后运营企业是否真实存在(EV-SSL证书)
其他的一些证书:
- 客户端证书:用于验证客户端(比较少见,因为客户要自己安装,用于网银之类的应用)
- 自认证机构和自签名证书:每个人都可以构建一套自己的认证机构(实际上没什么卵用)
- 中级认证机构:这些机构颁发的证书有时会被浏览器当作自签名证书
SSL会使通讯变慢
- 通信过程增加了SSL连接的步骤
- 加密和解密过程占用cpu(所以只在关键部位使用HTTPS,浪费资源还有浪费钱)
HTTPS的通信方式
HTTPS采用混合加密机制进行通信:公开密钥虽然安全但是比共享密钥慢,先用公开密钥方式交换共享密钥,再使用共享密钥进行通信。
HTTPS的安全通信流程
- 客户端发送通信请求
- 服务器把公开密钥和公开密钥证书发给客户端
- 客户端使用浏览器自带的数字验证机构的密钥,向数字验证机构确认服务器的公开密钥的合法性
- 客户端确认公开密钥合法,使用公开密钥加密一串共享密钥,然后把共享密钥发给服务器
- 服务器使用私有密钥解密获得共享密钥
- 然后服务器和客户端开始使用共享密钥进行通信