HTTPS:基于 SSL/TLS 的安全的 HTTP
- 所有信息都是加密传播,第三方无法窃听;
- 具有校验机制,一旦被篡改,通信双方会立刻发现;
- 配备身份证书,防止身份被冒充。
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密.
SSL/TLS 的基本过程
- 客户端向服务器端索要并验证公钥;
- 双方协商生成“对话密钥”;
- 双方采用“对话密钥”进行对称加密通信;
SSL 数字证书的签名和验证过程
加密算法
- 对称加密(单密钥加密)
使用同一个密钥对数据进行加密和解密,速度快。(eg: DES) - 非对称加密(双密钥加密)
使用两个密钥(公钥和私钥)分别进行加密和解密,速度比较慢。(eg: RSA)
如果使用公钥对数据进行加密,则只有对应的私钥才能解密;
如果使用私钥对数据进行加密,则只有对应的公钥才能解密。 - 散列算法(Hash)
将任意大小的数据映射到一个较小的固定长度的唯一值,理论上不可逆;
即无法根据散列结果推算出原始数据信息,常用于数据校验。(eg: SHA, MD5)
SSL 握手过程中心思想:SSL 握手过程中客户端使用服务端给的 RSA 公钥对 用于生成最终对话密钥的随机数 进行加密(RSA 非对称公钥加密法),并传给服务端;随后双方在数据传输过程中使用上述生成的对话密钥进行对称加密(对称加密算法由双方在握手过程商定),同时保证了安全和效率。
每一次对话(session),客户端和服务器端都生成一个"对话密钥"(session key),用它来加密信息。由于"对话密钥"是对称加密,所以运算速度非常快,而服务器公钥只用于加密"对话密钥"本身,这样就减少了加密运算的消耗时间。
SSL/TLS握手图解,自己吭哧吭哧画一堆,也没人家画得好,直接见 http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html ,阮老师很牛x的,
公钥存放在数字证书中,由服务端发给客户端,只要证书可信,公钥就可信。
数字证书
字段 | 说明 |
---|---|
Subject Name | 证书持有者的相关信息(国家/地区、组织、单位、CN) |
Issuer Name | 证书颁发者的相关信息(国家/地区、组织、单位、CN) |
Common Name | Subject Name 和 Issuer Name 信息里都包含一个常用名称字段(Common Name, CN),对于 CA 证书而言,该字段表示 CA 机构的名称,对于用户证书而言,通常是相应的域名。 |
Serial Number | CA 机构给该证书的唯一序列号 |
Not Valid Before | 证书生效日期 |
Not Valid After | 证书失效日期 |
Public Key | 服务端公开的密钥(RSA 公钥) |
Signature Algorithm | 签名所使用的算法(SHA-1,SHA-256 等) |
Signature | CA 机构给该证书的签名,用于验证证书是否被篡改 |
HTTPS 请求前的 SSL 握手过程中,用户证书和中间 CA 证书由服务端返回,而根 CA 证书则保存在客户端系统的可信任 CA 列表中。
证书更新策略
- 服务端计算出证书文件的 MD5 值,作为这个文件的数字签名。
- 服务端通过私钥加密第 1 步算出的 MD5 值,得到一个加密后的 MD5 值。
- 把证书文件和加密后的 MD5 值一起下发给客户端。
- 客户端拿到加密后的 MD5 值,通过保存在客户端的公钥解密。
- 客户端计算证书文件的 MD5 值。
- 对比第 4/5 步的两个 MD5 值(分别是客户端和服务端计算出来的 MD5 值),若相等则通过校验。
只要通过校验,就能确保证书在传输的过程中没有被篡改,因为第三方若要篡改证书文件,必须计算出新的证书文件 MD5 并用私钥加密,客户端公钥才能解密出这个 MD5 值,而在服务端未泄露的情况下第三方是拿不到私钥的。