# https
# 什么是 https
HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。
┌───────────────────────┐
│ HTTP │
└───────────┬───────────┘
┌───────────┴───────────┐
│ TLS/SSL │
└───────────┬───────────┘
┌───────────┴───────────┐
│ TCP │
└───────────┬───────────┘
┌───────────┴───────────┐
│ IP │
└───────────────────────┘
2
3
4
5
6
7
8
9
10
11
12
# 什么是 TLS 和 SSL
# SSL(Secure Socket Layer 安全套接层)
简而言之,SSL 是一项标准技术,可确保互联网连接安全,保护两个系统之间发送的任何敏感数据,防止网络犯罪分子读取和修改任何传输信息。
最初是由网景公司(Netscape)研发,后被IETF(The Internet Engineering Task Force - 互联网工程任务组)标准化后写入。
# TLS(Transport Layer Security 安全传输层协议),
在 SSL 更新到 3.0 时,IETF 对 SSL 3.0 进行了标准化,标准化后的 IETF 更名该标准为 TLS 1.0,可以看做是 SSL 3.1 版本。
与此同时,IETF 还发布 RFC2246-TLS加密协议详解 (opens new window)。
# TLS/SSL 区别
两者通常都会被叫做 SSL,TLS 其实是 SSL 的标准化的产物,并且现在网站基本使用的是 TLS。
TLS 在 SSL 基础上改进内容:
对于消息认证使用密钥散列法。TLS 使用“消息认证代码的密钥散列法”(HMAC),当记录在开放的网络上传送时,该代码确保记录不会被变更。HMAC 比 SSL 使用消息认证代码(MAC) 功能更安全。
增强的伪随机功能(PRF)。PRF生成密钥数据。在TLS中,HMAC定义PRF。PRF使用两种散列算法保证其安全性。如果任一算法暴露了,只要第二种算法未暴露,则数据仍然是安全的。
改进的已完成消息验证。TLS 和 SSL 都对两个端点提供已完成的消息,该消息认证交换的消息没有被变更。然而,TLS将此已完成消息基于 PRF 和 HMAC 值之上,这也比 SSL 更安全。
一致证书处理。与 SSL 不同,TLS 试图指定必须在 TLS 之间实现交换的证书类型。
特定警报消息。TLS 提供更多的特定和附加警报,以指示任一会话端点检测到的问题。TLS 还对何时应该发送某些警报进行记录。
# 加密算法
TLS/SSL 的功能实现主要依赖于三类基本算法:散列函数 、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。
# 对称加密算法
加密和解密同用一个密钥。
优点:
解决了 HTTP 中消息保密性的问题。
缺点:
客户端和服务器共享一个密匙,这样就使得密匙特别容易泄露,所以很难保证消息来源的可靠性、消息的完整性和准确性。
# 非对称加密算法
客户端和服务端均拥有一个公匙和一个私匙。公匙可对外暴露,私匙仅自己可见。使用公匙加密的消息,只有对应的私匙才能解开。
优点:
解决了 HTTP 中消息保密性问题,使得私匙泄露的风险降低,所以较大程度上保证了消息的来源性及消息的准确性和完整性。
缺点:
公钥是公开的,所以针对私钥加密的信息,黑客截获后可以使用公钥进行解密,获取其中的内容。
最重要的是,非对称加密的性能相对于对称加密来说会慢上几倍甚至几百倍,比较消耗系统资源。
# 数字证书
# 为什么需要数字证书?
服务端的公钥可能被攻击者拦截更改,所以需要一个值得信任的第三方证明公钥确实是服务端的公钥,这就是证书颁发机构(Certificate Authority,简称CA)。CA 数量并不多,客户端内置了所有受信任 CA 的证书。
数字签名能确定消息的完整性,证明数据未被篡改。
# 数字证书申请
服务器本地生成一对密匙,然后拿着公匙及其他信息(如企业名称)去 CA 申请数字证书
CA通过线上、线下等多种手段验证申请者提供信息的真实性。
如信息审核通过,CA 在拿到这些信息后,会选择一种单向 Hash 算法(如常见的 MD5)对这些信息进行加密,加密后的东西称之为摘要。
单向 Hash 算法有一种特点是单向不可逆,对输入很敏感,只要原始内容有一点变化,加密后的数据都会完全不一样,这样就防止了信息被篡改。
生成摘要后,CA 会用自己的私匙对摘要进行加密,摘要加密后的数据称为数字签名。
最后,CA 将会把我们的申请信息和数字签名整合在一起,由此生成数字证书,颁发给申请者。
证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。
# 数字证书验证
客户端收到服务端的证书,读取证书中的相关的明文信息,采用相同的单向 Hash 算法计算得到信息摘要,然后利用对应 CA 的公钥解密签名数据,对比证书的信息摘要是否一致。
同时,还会继续验证上一级证书是否有效,这是一个递归的过程,直到验证到根证书。
如果没通过验证,则会显示警告信息。
# HTTPS 加密过程
由于对称加密算法速度快,客户端和服务端的消息通信使用的是对称加密。但是对称加密算法的秘钥需要通过非对称加密算法进行双方交换。
客户端请求连接
服务端将自己的数字证书发送给客户端
客户端通过数字证书验证客户端身份真实性,然后使用伪随机数生成器生成加密所使用的对称密钥,再用证书携带的公钥加密这个秘钥,发送给服务端。
服务端收到消息后,用自己的私钥解密,获得客户端确定的对称加密算法的秘钥。至此,双方都持有了相同的对称密钥。
之后的消息全部使用双方确定的对称加密算法的秘钥进行加密传输