HTTPS / SSL / TLS

创建时间:
2012-11-08 14:12
最近更新:
2018-06-19 22:51

Keyword

  • HTTPS (Hyper Text Transfer Protocol over Secure Socket Layer, 安全套接字层超文本传输协议)
  • SSL (Secure Sockets Layer)
  • TLS (Transport Layer Security)
  • IETF (Internet Engineering Task Force)
  • Netscape (网景公司)

Overview

HTTP 协议明文传输数据。

为了对 HTTP 协议传输的数据进行加密,Netscape 设计了 SSL 协议,从而诞生了 HTTPS。

HTTPS 是一种基于 SSL/TLS 的 HTTP,所有的 HTTP 数据都是在 SSL/TLS 协议封装之上传输的。HTTPS 协议在 HTTP 协议的基础上,添加了 SSL/TLS 握手以及数据加密传输,也属于应用层协议。所以,研究 HTTPS 协议原理,最终是研究 SSL/TLS 协议。

SSL 是一种安全传输协议,最初由 Netscape 在 1996 年发布。由于一些安全的原因 SSL1.0 和 SSL2.0 都没有公开,直到 1996 年的 SSL3.0。SSL3.0 被 IETF 定义在 RFC 6101 中。因为 TLS 的出现,3.0 成了 SSL 的最后一个版本。

IETF 对 SSL3.0 进行了升级,于是出现了 TLS 1.0,定义在 RFC 2246 中。目前 TLS 的版本是 1.2,定义在 RFC 5246 中,暂时还没有被广泛的使用。目前市面上所有的 HTTPS 都在使用 TLS,而不是 SSL。但是由于 SSL 出现的时间比较早,并且依旧被现在浏览器所支持,因此 SSL 依然是 HTTPS 的代名词。

无论是 TLS 还是 SSL 都是上个世纪的事情,SSL 最后一个版本是 3.0,今后 TLS 将会继承 SSL 优良血统继续为我们进行加密服务。对历史感兴趣的朋友可以参考 http://en.wikipedia.org/wiki/Transport_Layer_Security,这里有对 TLS/SSL 详尽的叙述。

Port

HTTP 使用 80 端口。
HTTPS 使用 443 端口。

TLS 握手

TLS 的握手阶段是发生在 TCP 握手之后。握手实际上是一个协商的过程,对协议所必需的一些参数进行协商。

TLS 握手过程分为四步,过程如下:

Client Hello

客户端向服务端发送:

  1. 客户端支持的加密算法的列表。
  2. 一个随机数。

由于客户端 (如浏览器) 对一些加解密算法的支持程度不一样,但是在 TLS 协议传输过程中必须使用同一套加解密算法才能保证数据能够正常的加解密。在 TLS 握手阶段,客户端首先要告知服务端,自己支持哪些加密算法,所以客户端需要将本地支持的加密套件 (Cipher Suite) 的列表传送给服务端。除此之外,客户端还要产生一个随机数,这个随机数一方面需要在客户端保存,另一方面需要传送给服务端,客户端的随机数需要跟服务端产生的随机数结合起来产生后面要讲到的 Master Secret。

Server Hello

服务端向客户端发送:

  1. 服务端的证书。
  2. Server Key Exchange。
  3. Certificate Request (optional)。
  4. 一个随机数。
  5. Server Hello Done。

上述数据,从 Server Hello 到 Server Done,有些服务端的实现是每条单独发送,有服务端实现是合并到一起发送。Sever Hello 和 Server Done 都是只有头没有内容的数据。

服务端在接收到客户端的 Client Hello 之后,服务端需要将自己的证书发送给客户端。这个证书是对于服务端的一种认证。例如,客户端收到了一个来自于自称是 www.AliPay.com 的数据,但是如何证明对方是合法的 AliPay 呢?这就是证书的作用,AliPay 的证书可以证明它是 AliPay,而不是 TenPay。证书需要申请,并由专门的数字证书认证机构 (CA) 通过非常严格的审核之后颁发的电子证书。颁发证书的同时会产生一个私钥和公钥。私钥由服务端自己保存,不可泄漏。公钥则是附带在证书的信息中,可以公开的。证书本身也附带一个证书电子签名,这个签名用来验证证书的完整性和真实性,可以防止证书被串改。另外,证书还有个有效期。

在服务端向客户端发送的证书中没有提供足够的信息的时候,还可以向客户端发送一个 Server Key Exchange。

此外,对于非常重要的保密数据,服务端还需要对客户端进行验证,以保证数据传送给了安全的合法的客户端。服务端可以向客户端发出 Certificate Request 消息,要求客户端发送证书对客户端的合法性进行验证。

跟客户端一样,服务端也需要产生一个随机数发送给客户端。客户端和服务端都需要使用这两个随机数来产生 Master Secret。

最后服务端会发送一个 Server Hello Done 消息给客户端,表示 Server Hello 消息结束了。

Client Key Exchange

客户端向服务端发送:

  1. 客户端的证书 (optional)。
  2. ChangeCipherSpec。
  3. Finish。

如果服务端需要对客户端进行验证,在客户端收到服务端的 Server Hello 消息之后,首先需要向服务端发送客户端的证书,让服务端来验证客户端的合法性。

在此之前的所有 TLS 握手信息都是明文传送的。在收到服务端的证书等信息之后,客户端会使用一些加密算法 (例如:RSA, Diffie-Hellman) 产生一个 48 个字节的 key,这个 key 叫 PreMaster Secret,很多材料上也被称作 PreMaster Key,最终通过 Master Secret 生成 Session Secret,Session Secret 就是用来对应用数据进行加解密的。PreMaster Secret 属于一个保密的 key,只要截获 PreMaster Secret,就可以通过之前明文传送的随机数,最终计算出 Session Secret,所以 PreMaster Secret 使用 RSA 非对称加密的方式,使用服务端传过来的公钥进行加密,然后传给服务端。

接着,客户端需要对服务端的证书进行检查,检查证书的完整性以及证书跟服务端域名是否吻合。

ChangeCipherSpec 是一个独立的协议,体现在数据包中就是一个字节的数据,用于告知服务端,客户端已经切换到之前协商好的加密套件的状态,准备使用之前协商好的加密套件加密数据并传输了。

在 ChangecipherSpec 传输完毕之后,客户端会使用之前协商好的加密套件和 Session Secret 加密一段 Finish 的数据传送给服务端,此数据是为了在正式传输应用数据之前对刚刚握手建立起来的加解密通道进行验证。

Server Finish

服务端向客户端发送:

  1. ChangeCipherSpec。
  2. Finish。

服务端在接收到客户端传过来的 PreMaster 加密数据之后,使用私钥对这段加密数据进行解密,并对数据进行验证,也会使用跟客户端同样的方式生成 Session Secret,一切准备好之后,会给客户端发送一个 ChangeCipherSpec,告知客户端已经切换到协商过的加密套件状态,准备使用加密套件和 Session Secret 加密数据了。之后,服务端也会使用 Session Secret 加密后一段 Finish 消息发送给客户端,以验证之前通过握手建立起来的加解密通道是否成功。

根据之前的握手信息,如果客户端和服务端都能对 Finish 信息进行正常加解密且消息正确的被验证,则说明握手通道已经建立成功,接下来,双方可以使用上面产生的 Session Secret 对数据进行加密传输了。

沃通电子认证服务有限公司 - 周鸿祎的公司

  1. 关于沃通 (WoTrus)
  2. 沃通 CA 有 5 个股东: 奇虎 360 软件公司、Beijing Qifutong Technology 有限公司、Beijing Yuan Tu Technology 有限公司、王高华、以及另一个人。奇虎首席安全官谭晓生 承认 奇虎 360 软件、Beijing Qifutong 和 Beijing Yuan Tu 实际上是同一家公司
  3. 根据以色列企业登记信息 StartCom 现在的所有人是中国籍的 沃通 CEO 王高华 (aka Richard Wang)
  4. StartCom 实际上已经被沃通完全收购
  1. Wosign 沃通
  1. 我是如何迫使沃通给我签发 Github 的 SSL 证书的
  2. Google 将完全取消 WoSign (沃通) 和 StartCom 的信任
  3. http://wiki.mozilla.org/CA:WoSign_Issues - WoSign Issues
  4. 如何看待 沃通 WoSign 偷偷收购自己的根 CA StartCom 并且签发 GitHub.com 的证书
  5. 如何看待 Mozilla 决定停止信任沃通 (WoSign) 和 StartCom 颁发的证书
  1. 如何看待沃通证书销售发垃圾邮件黑 Let's Encrypt
  2. 国外用户揭 沃通 (WoSign) 恶意注册 Let’s Encrypt 域名

Let's Encrypt

  1. 如何一键申请又拍云 Let's Encrypt Symantec 免费证书并升级 HTTPS

.NET 操作数字证书

  1. System.Security.Cryptography.X509Certificates 命名空间 - The System.Security.Cryptography.X509Certificates namespace contains the common language runtime implementation of the Authenticode X.509 v.3 certificate. This certificate is signed with a private key that uniquely and positively identifies the holder of the certificate (该 命名空间 包含验证码 X.509 v.3 证书的公共语言运行时实现。此证书由唯一且正确标识证书持有者的私钥进行签名。).
  2. .NET 中如何操作数字证书
  3. 从 PFX 文件中 解析公钥和私钥 (X509Certificate2)
  4. PFX/CER 证书导入 - PFX 数字证书内既有公钥又有私钥,CER 数字证书内只有公钥。

工具

  1. HTTPS 网站检测工具 - Qualys SSL Labs
  2. OpenSSL 在线 合成 PFX 文件

Resource - 证书

  1. 证书,无本大生意
  2. SSL 证书服务,大家用哪家的?

Resource - 免费证书

  1. 八大免费 SSL 证书
  2. 阿里云、腾讯云 免费证书
  3. 在阿里云里申请免费 HTTPS 证书 SSL

Resource - 部署/配置

  1. 阿里云 HTTPS 部署网站
  2. IIS 部署免费 HTTPS
  3. ASP.NET 配置 全站 HTTPS - 全站 HTTPS 就是指整个网站的所有页面、所有资源全部使用 HTTPS 链接。当用户的某个请求是明文的 HTTP 时,应该通过 HTTP 状态码 301 永久重定向到对应的 HTTPS 链接。
  4. ASP.NET 配置 HTTPS
  5. ASP.NET Core Kestrel 部署 HTTPS (OpenSSL 10年期 根证书 root.crt)

Resource

  1. The Transport Layer Security (TLS) Protocol Version 1.2
  2. SSL/TLS 协议运行机制的概述
  3. 图解 SSL/TLS 协议
  4. SSL/TLS 协议运行机制的概述 - Tony Praise
  5. HTTPS (SSL/TLS) 原理详解 - Tony Praise
  6. 也许,这样理解 HTTPS 更容易 - 翟志军 2017-02-20
  7. 也许,这样理解 HTTPS 更容易
  8. HTTPS 那些事 (一) HTTPS 原理
  9. HTTPS 那些事 (二) SSL 证书
  10. HTTPS 那些事 (三) 攻击实例与防御
  11. SSL 协议中的 DH 算法的 pre-master-secret
  12. 图解 SSL/TLS 协议
  13. 聊聊 HTTPS 和 SSL/TLS 协议
  14. HTTPS 连接的前几毫秒发生了什么
  15. HTTPS 连接最初的若干毫秒
  16. HTTPS 背后的加密算法
  17. HTTP 是时候安息了: HTTPS 加速推进
  18. 也许这样理解 HTTPS 更容易
  19. HTTPS 为什么安全 & 分析 HTTPS 连接建立全过程
  20. HTTPS 是如何保证安全的
  21. The First Few Milliseconds of an HTTPS Connection
  22. SSL/TLS 原理详解
  23. SSL 与 TLS 的区别以及介绍
  24. 全站 HTTPS 来了
  25. HTTPS 优化 - HTTPS 网站检测工具 - Qualys SSL Labs
  26. HTTPS 要比 HTTP 多用多少服务器资源
  27. HTTPS 证书不受信任是什么原因