〇、概述
作为概述,以下是本文要讲的内容。HTTPS 是什么? 每个人都可能从浏览器上认出 HTTPS,并对它有好感。然后再讲一遍基础知识,再详细讲一下协议版本,密码套件(Cipher Suites),本文的重点会落在如何配置 NGINX,让你的网站使用 HTTPS 服务。
除此之外,还有一个使用 HTTPS 作为代理的问题; 所以,如果你的 NGINX 在另一个应用程序的前面,你如何设置NGINX 作为 HTTPS 客户端。
在这里,我会介绍一些方法,用以检查你的 HTTPS 配置,以看到它是最安全的和最新的,以及一些额外主题,帮助你得到你需要的 A+ 级别的安全。
本文涉及以下内容:
- 什么是 HTTPS
- 协议版本
- 密码套件
- 证书
下一篇的内容将包括:
- 配置 NGINX
- 后端 HTTPS
- 检查配置
- 配置 HSTS
- OCSP Stapling
一、什么是 HTTPS
你可能猜到了,HTTPS 就是 HTTP 加 S, S 代表安全(Security)。就网络而言,有两种协议,分别叫做 SSL 和 TLS。它们可以互换使用。但是,「安全协议」(a security protocol)是位于通信之上的安全层。如果你想一下OSI 七层网络模型,那么它位于第 7 层的下面即第 6 层,叫做表示层。
在客户端和服务器之间,它向您提供的是数据的保密性。因此,所有从客户端发送到服务器的信息都是完全加密的,所以只有两个人知道如何读取信息,那就是客户端和服务器。它还提供了一种形式的身份验证,在这种身份验证中,客户机可以知道服务器到底是谁。这些都交织在握手(handshake)的概念中。
1.1 SSL 握手 (Diffie‑Hellman)
- 客户端:客户端发送 hello、客户端随机(client random)和受支持的密码套件(cipher suites)给服务器;
- 第二步
- 2a:服务器发送服务器随机(server random)和公钥证书(public key certificate)(也会发送一个用于会话复用的session ID)给客户端。
- 2b:客户端随机、服务器随机和公钥证书的密钥签名。
- 服务器发送服务器 DH (Diffie‑Hellman) 参数和密钥签名(signature)给客户端。
- 客户端发送客户端 DH 参数给服务器。
- 客户端和服务器都从服务器 DH 参数和客户端 DH 参数中获得相同的 premaster secret。
- 客户端和服务器都从客户端随机、服务器随机和 premaster secret 中获得相同的会话密钥(session keys)。客户端可以从服务器请求内容,并且请求将被加密。(也发送了会话复用的会话票据(session ticket))
上图是 SSL/TLS 握手流程。这有点复杂; 有很多可移动的部分,但本质上,如果你退一步看,它是在客户端和发送加密信息的服务器之间额外的一到两次往返。在这种情况下,你有几个选项——有服务器随机,有客户端随机; 这些都是你不需要知道的深奥的东西。
您只需要知道服务器本身发送一个公钥,客户端和服务器建立一个共享 secret,它们可以使用这个 secret 来加密通信。因此,访问者和服务器之间的所有通信都使用对称密钥加密,这意味着双方都有相同的密钥。还有一个完整性密钥,在本例中是 HMAC,但我暂时先跳过这个图,转而讨论更重要的问题: 「为什么需要设置HTTPS?」
1.2 为什么需要设置 HTTPS
- 用户隐私
- SEO 加成
- 放在「没有 HTTPS 能力的服务」的前面
- 通用最佳实践
主要原因是用户隐私。在服务通信的情况下,这是信息的隐私 - 你有多信任你正在使用的传输信息的网络? 你相信这些网络不会向你的流量中注入信息,并且能够读取传输的信息吗? 另外 2015 年之后,如果你在你的网站上使用 https,它提供了一个搜索引擎优化的优势,谷歌排名(以及国内的百度)将会比那些不支持 HTTPS 的网站排名更高。
另一件你可以为 HTTPS 做的事情(这是 NGINX 的主要用例之一)是把它放在那些不支持 HTTPS 或不支持最现代、最新版本的 SSL 和 TLS 的服务前面。因此,你可以从 NGINX 得到的是所有加密算法的最好、最先进的实现,你不需要真的去思考 HTTPS 的复杂性,总的来说,这是一个很好的实践。
另外,如果有人去访问一个网站,他们喜欢看到那个快乐的小锁图标。在本例中是 nginx.com,它启用了 HTTPS 和 HSTS (我将在后面讨论这个特性)。你不能再使用普通的 HTTP 版本访问了; 浏览器知道总是使用 HTTPS。你在这里看到的另一件事是,有一个漂亮的 NGINX, Inc 与 [US] 显示这是一个扩展验证证书 —— 本质上,这个证书表明NGINX 是哪家公司的。他们为此多付了一点钱,做了一些调查并在证书上展示出来。
1.3 HTTPS 带来的缺点有哪些?
- 操作运维的复杂性
- 额外的延迟(首次连接多了 2 次往返)
- CPU 消耗
但 HTTPS 不是十全十美; 也有一些缺点。具体来说,有一点操作运维上的复杂性。你必须管理证书,你必须确保它们持续更新。您需要有受信任的管理员来保存私钥资料。
当你通过 HTTPS 连接到一个网站时,第一次可能会慢一些; 如果您的物理距离不一定很近,那么除了 TCP 握手之外,还有 SSL 握手,正如我提到的,它至少增加了两次往返。因此,延迟会受到轻微的影响,但这可以通过 SSL 的一些更高级的特性(如 SPDY 和 HTTP/2 )来缓解,本文不会详细介绍这些特性。
最终 HTTPS 可以和 HTTP 一样快,但有时不是。你的服务器上也有加密的成本; 这是一个很长时间不使用 HTTPS 的原因,但它越来越不适用。最新一代英特尔服务器可以非常快速地完成 HTTPS 所需的加密,而且几乎没有成本。所以,在现代硬件中,加密传输中的数据基本上是免费的。
1.4 你需要为 HTTPS 做哪些事情?
- 支持的一系列 SSL/TLS 协议
- 倾向使用的一系列的密码套件
- 由受信任的证书机构(CA)签名的私钥和证书
如果你想为你的服务或网站设置 HTTPS,你需要做一些选择并获得一些东西。第一个「决定」是您想要支持的协议,第二个「决定」是您想要支持的密码(后面将详细说明这意味着什么),还有「您需要获得」证书和相应的私钥。这是一个重要的部分,由客户信任的第三方证书颁发机构「颁发」。我稍后会讲到,但首先让我们谈谈协议版本(protocol versions)。
二、协议版本(Protocol Versions)
回顾一下前文,HTTPS 是 HTTP 加上 S,S一直在变化; 它是随着时间而进化的。最初,SSL v1.0 是 Netscape(网景) 发明的协议。有一个著名的轶事是,马克·安德森(Marc Andreessen)在麻省理工学院做演讲时观众席上有人用铅笔描述了如何破解密码算法。
所以,SSL TLS 加密协议其实并没有很长的历史,1995 年 网景 发布了 SSL v2.0,这也是 web 加密的开始。这使得电子商务领域,人们可以在线提交密码和信用卡,并且至少是相当安全的。
2.1 HTTPS 历史背景
接下来请参见加密协议历史概要 - HTTPS 基础原理和配置 - 1 - 东风微鸣技术博客 (ewhisper.cn)