1. HTTPS概述
https是由http加上ssl的来的,之前一直使用的http通信过程直接用的明文,安全性极低,攻击人可以很容易窃取通信内容,同时冒充服务器和用户通信,窃取用户隐私数据。为了保证安全性,https引入了认证机制以及加密的通信。
2.HTTPS过程详解
首先我们要知道https的存在是为了证明和浏览器通信的服务器是合法的,同时保证通信过程不被第三方窃取。所以https重点要做的事两个:
- 服务器认证;
- 通信密钥协商;
2.1 服务器认证过程
在认证服务器时需要第三方机构来进行认证,这个机构叫做认证授权机构(Certificate Authority),它能够帮助客户端认证服务端的合法性。
认证过程如上图所示:
- 首先服务端会生成一对公私钥,将公钥S.pub发送给CA进行认证;
- 认证服务器用自己的私钥C.pri对S.pub进行签名(加密),得到sig,同时将sig和S.pub绑定组成证书;
- CA将证书返回给服务端;
- 这时候浏览器(客户端)要访问服务端的某个网页或资源。从认证服务器那里获取了公钥C.pub,同时对服务端发起http请求;
- 在建立连接后,服务端将证书发送给浏览器;
- 浏览器用CA的公钥对证书中的签名sig进行解密,得到一个S.pub^,将它和证书中的S.pub进行对比,如果两者相同,说明服务端是合法的,否则是不合法的。
为什么这个过程可以证明服务端是合法的?
假设一个钓鱼网站想要冒充支付宝支付页面,攻击者自己生成了一对公私钥,它无法使用认证机构的私钥进行签名(因为它没办法通过认证机构的认证),那么如果它随便用一个数对自己的公钥签名,得到了sig,把自己的公钥加进去做成一个假证书,当浏览器用CA的公钥对它解密时,结果和假证书里面的公钥就不相等,则认证失败。
在客户端验证了服务端的签名合法性之后,可以确定两件事:
- 认证服务器是真实有效的认证机构;
- 服务端是合法的;
2.2通信加密
在验证了服务端的合法性之后,客户端和服务端需要协商通行过程所用的加密密钥,一般使用对称密钥加密算法,因为对称加密时间开销大大小于非对称加密。
那么这个对称加密算法的密钥如何让通信双方获取呢?
密钥交换
https使用了密钥交换算法来使客户端和服务端安全的交换一个密钥。常用的密钥交换算法有Diffie-Hellman 密钥交换算法。
- 首先客户端回生成一个随机数a,这个数是客户端私有的,还生成一个大素数p以及p的原根g;
- 客户端使用a、g、p生成公开密钥A,然后把A、g、p发送给服务端;
- 服务端生成随机数b,服务端私有。然后生成公开密钥B。利用A,b,p生成共享密钥K。最后把B发送给客户端;
- 客户端利用B、a、p生成共享密钥K(和服务端的相同);
通过上诉4个步骤,服务端和客户端就能够安全交换共享密钥,然后使用密钥K进行基于对称密钥加密算法的加密通信,DH算法主要利用离散对数难以计算的难题防止治密钥a、b被中间人破解。
在不安全的网络中,只有p、g、A、B能被获取,但是攻击者不能通过这四个数逆推出离散对数a、b。