此篇记录一些HTTPS协议相关的内容。

HTTPS 基础

  1. 为了解决HTTP的安全性问题,HTTPS做了加密通信。在传输层增加了一层 SSL(Secure Sockets Layer 安全套接层)/ TLS (Transport Layer Security 安全层传输协议) 来加密 HTTP 的通信内容。
  2. SSL指的是安全套接字层——一种通过加密和身份验证在网络浏览器和服务器之间传输数据时添加密钥的小型数据文件。
  3. HTTPS 采用混合的加密机制,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。
  4. HTTPS 通过使用 证书(数字证书认证机构CA,Certificate Authority) 来对通信方进行认证。
  5. 进行 HTTPS 通信时,服务器会把证书发送给客户端,客户端取得其中的公开密钥之后,先进行验证,如果验证通过,就可以开始通信。
  6. TLS 握手协议

握手协议是整个 TLS 协议簇中最最核心的协议,HTTPS 能保证安全也是因为它的功劳。
握手协议由多个子消息构成,服务端和客户端第一次完成一次握手需要 2-RTT。
握手协议的目的是为了双方协商出密码块,这个密码块会交给 TLS 记录层进行密钥加密。也就是说握手协议达成的“共识”(密码块)是整个 TLS 和 HTTPS 安全的基础。

HTTPS 配置项

  1. Nginx使用配置项 ssl_certificate 进行证书配置。
  2. HTTPS提供了端到端的安全加密。不仅提供数据机密性(加密),还提供数据完整性(不被篡改数据)保护、防重放(把捕获的报文再发一次无效)。
  3. 加密传输之后,有了HMAC保护,任何篡改页面的尝试,由于没有session key,无法计算出和篡改网页一致的HMAC,所以数据接收端的SSL/TLS会轻易地识别出网页已被篡改,然后丢弃。既然无法劫持,也就没有篡改的冲动了,所以HTTPS可以很好地对付网页劫持。

非对称加密

“非对称加密”的加密算法,特点是私钥加密后的密文,只要是公钥都可以解密。但是公钥加密后的密文,只有私钥可以解密。
私钥只有一个人有,而公钥可以发给所有的人。

加密算法协商

如何做到Web服务器针对每个客户端使用不同的对称加密算法?
使用随机数来生成对称加密算法。这样就可以做到服务器和客户端每次交互都是新的加密算法、只有在交互的那一该才确定加密算法。这也是为什么HTTPS协议握手阶段会有这么多的随机数的原因。

公钥分发

服务器端将公钥发送给每一个客户端。

数字签名

解决同一机构颁发的不同证书被篡改问题。

客户端验证

客户端本地怎么验证证书呢?答案是证书本身就已经告诉客户端怎么验证证书的真伪。证书上写着如何根据证书的内容生成证书编号。客户端拿到证书后根据证书上的方法自己生成一个证书编号,如果生成的证书编号与证书上的证书编号相同,那么说明这个证书是真实的。同时,为避免证书编号本身又被调包,所以使用第三方的私钥进行加密。

证书颁发机构

现实中,浏览器和操作系统都会维护一个权威的第三方机构列表(包括它们的公钥)。因为客户端接收到的证书中会写有颁发机构,客户端就根据这个颁发机构的值在本地找相应的公钥。

HTTP 的端口号是 80,HTTPS 的端口号是 443。