关于运维:HTTPS基础原理和配置2

1次阅读

共计 7180 个字符,预计需要花费 18 分钟才能阅读完成。

〇、概述

作为概述,以下是本文要讲的内容。HTTPS 是什么? 每个人都可能从浏览器上认出 HTTPS,并对它有好感。而后再讲一遍基础知识,再具体讲一下协定版本,明码套件(Cipher Suites),本文的重点会落在如何配置 NGINX,让你的网站应用 HTTPS 服务。

除此之外,还有一个应用 HTTPS 作为代理的问题; 所以,如果你的 NGINX 在另一个应用程序的后面,你如何设置 NGINX 作为 HTTPS 客户端。

在这里,我会介绍一些办法,用以查看你的 HTTPS 配置,以看到它是最平安的和最新的,以及一些额定主题,帮忙你失去你须要的 A+ 级别的平安。

本文波及以下内容:

  1. 什么是 HTTPS
  2. 协定版本
  3. 明码套件
  4. 证书

下一篇的内容将包含:

  1. 配置 NGINX
  2. 后端 HTTPS
  3. 查看配置
  4. 配置 HSTS
  5. OCSP Stapling

一、什么是 HTTPS

你可能猜到了,HTTPS 就是 HTTPS, S 代表平安(Security)。就网络而言,有两种协定,别离叫做 SSL 和 TLS。它们能够调换应用。然而,「平安协定」(a security protocol)是位于通信之上的平安层。如果你想一下 OSI 七层网络模型,那么它位于第 7 层的上面即第 6 层,叫做表示层。

在客户端和服务器之间,它向您提供的是数据的保密性。因而,所有从客户端发送到服务器的信息都是齐全加密的,所以只有两个人晓得如何读取信息,那就是客户端和服务器。它还提供了一种模式的身份验证,在这种身份验证中,客户机能够晓得服务器到底是谁。这些都交错在握手(handshake)的概念中。

1.1 SSL 握手 (Diffie‑Hellman)

  1. 客户端:客户端发送 hello、客户端随机(client random)和受反对的明码套件(cipher suites)给服务器;
  2. 第二步

    1. 2a:服务器 发送服务器随机(server random)和公钥证书(public key certificate)(也会发送一个用于会话复用的 session ID)给客户端。
    2. 2b:客户端随机、服务器随机和公钥证书的密钥签名。
  3. 服务器 发送服务器 DH (Diffie‑Hellman) 参数和密钥签名(signature)给客户端。
  4. 客户端 发送客户端 DH 参数给服务器。
  5. 客户端和服务器都从服务器 DH 参数和客户端 DH 参数中取得雷同的 premaster secret。
  6. 客户端和服务器都从客户端随机、服务器随机和 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)

😂被破解历史概要 – HTTPS 根底原理和配置 – 1 – 东风微鸣技术博客 (ewhisper.cn)

2.2 客户端兼容性

请参见:客户端兼容性 – HTTPS 根底原理和配置 – 1 – 东风微鸣技术博客 (ewhisper.cn)

2.3 配置选项及得分

请参见:配置倡议 – HTTPS 根底原理和配置 – 1 – 东风微鸣技术博客 (ewhisper.cn)

三、明码套件(Cipher Suites)

当初让咱们进入明码套件。什么是明码套件? SSL、TLS 和 HTTPS 应用各种加密算法来建设连贯,这实际上是一个字母池。它们是什么意思?

明码套件就是形容应用的加密类型的简单字符串,它是由 openssl 定义的(能够通过 openssl ciphers 查看你的明码套件)。

示例如下:

TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:RSA-PSK-AES256-GCM-SHA384:DHE-PSK-AES256-GCM-SHA384:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:AES256-GCM-SHA384:PSK-AES256-GCM-SHA384:PSK-CHACHA20-POLY1305:RSA-PSK-AES128-GCM-SHA256:DHE-PSK-AES128-GCM-SHA256:AES128-GCM-SHA256:PSK-AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:ECDHE-PSK-AES256-CBC-SHA384:ECDHE-PSK-AES256-CBC-SHA:SRP-RSA-AES-256-CBC-SHA:SRP-AES-256-CBC-SHA:RSA-PSK-AES256-CBC-SHA384:DHE-PSK-AES256-CBC-SHA384:RSA-PSK-AES256-CBC-SHA:DHE-PSK-AES256-CBC-SHA:AES256-SHA:PSK-AES256-CBC-SHA384:PSK-AES256-CBC-SHA:ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES128-CBC-SHA:SRP-RSA-AES-128-CBC-SHA:SRP-AES-128-CBC-SHA:RSA-PSK-AES128-CBC-SHA256:DHE-PSK-AES128-CBC-SHA256:RSA-PSK-AES128-CBC-SHA:DHE-PSK-AES128-CBC-SHA:AES128-SHA:PSK-AES128-CBC-SHA256:PSK-AES128-CBC-SHA

3.1 明码套件拆解

从实质上讲,第一个术语是 密钥替换,即单方用来替换密钥的算法。在上图这种状况下,它是基于 Diffie-Hellman 算法。

第二个术语是您的 证书中的密钥类型。因为每个证书都有一个特定类型的公钥。这里是 RSA。

第三局部是你的 传输明码,用来加密所有数据的加密算法。这外面有很多不同的局部,但 AES-GCM 是最平安的明码; 这实际上是英特尔处理器简直零老本实现的事件。所以这是一个相当便宜和牢靠的明码应用。

最初一点是 完整性。正如我提到的,音讯有一个缓存,以确保它们没有被篡改,但如果它是加密的,并具备完整性,你能够从那里校验。

3.2 服务器明码套件

  • 客户端按优先程序列出受反对的明码套件
  • 服务器承受:客户端列表和服务器反对的明码列表的交加
  • 服务器会抉择剩下中的更喜爱的那些

当初,并不是所有的浏览器和服务器都反对雷同的明码列表。这被称为 协定灵活性,本质上服务器所做的是: 客户端说,“嘿,这就是我所反对的全副”。服务器说:“好吧,我晓得其中的五个。我会挑我最喜爱的”。

3.3 明码套件约定(Cipher Suite Negotiation)

因而,如上图所示,如果客户端说,「右边的这些是我顺次反对的」,而服务器端只反对两个,而后它就会抉择本人喜爱的。

3.4 举荐的明码套件

这并不是一个争执的大问题,但你有很多抉择。CloudFlare 应用这个明码套件列表,你能够在 GitHub 的这里找到它。有一个 NGINX 配置格局,这些是 CloudFlare 举荐的。这些是 CloudFlare 上的所有网站最终都会应用的。

ssl_protocols               TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ecdh_curve              X25519:P-256:P-384:P-521;
ssl_ciphers                 '[ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-ECDSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305]:ECDHE+AES128:RSA+AES128:ECDHE+AES256:RSA+AES256:ECDHE+3DES:RSA+3DES';
ssl_prefer_server_ciphers   on;

有一种很酷的新密码叫 ChaCha 20。在主线 NGINX 它还不反对,其余的都能够用。Mozilla 在这方面也有本人的倡议,你能够去拜访他们的服务器端 TLS 站点,他们会为你生成 NGINX 或任何你可能应用的网络服务器的 SSL 配置。这就是明码套件。生成的示例如下:

# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

四、证书

当初咱们有了协定集和明码集; 接下来是证书。这是 HTTPS 最重要的局部。这是在客户背后标识您作为一个站点的标记。然而,证书里有什么呢?

4.1 证书里有什么?

  • 组织名(Organization name)
  • 公钥(Public Key)
  • 颁发者名称(Issuer name)
  • 权限

    • 有效期
    • 域名(Hostnames)
  • 颁发者数字签名(Digital signature by issuer)

其中包含你的名字(你是谁)、你的站点实用于哪些域名、证书何时无效、公钥(客户能够应用公钥验证你用它签名的任何货色),而后是数字签名。数字签名是来自公共证书颁发机构的戳记,表明它是一个实在的证书: 这个人实际上领有这个 DNS 名称,并且在这些点上是无效的。

4.2 什么是授信证书?

那么,是什么使证书可信呢? 这是目前互联网上所有证书颁发机构 (ca) 的分类,大多数证书都是由这些机构签订的。这里有一些常见的名字。赛门铁克曾经购买了几个这样的证书颁发机构,包含 GeoTrust、Verisign 等。

这些都是受信赖的大公司,最重要的是,它们的证书受到浏览器的信赖。因而,如果赛门铁克通过某人从他们那里购买证书的过程示意该证书良好,那么浏览器将显示绿锁。

4.3 我如何取得一个证书?

您能够通过创立私钥或一对密钥来取得证书,而后将您的公钥发送给证书颁发机构,通过验证签章将其转换为证书。这通常会破费一些钱 (有收费的办法),但实质上私钥你必须放弃公有, 惟一应该失去它的实体是你的管理员和你的 web 服务器自身

4.4 我如何创立一个 CSR(证书签名申请)和私钥?

有几种办法能够创立这些密钥对。CSR 实质上是将公钥打包到证书颁发机构以创立证书的办法。有 OpenSSL, CFSSL 等多种形式。

应用 OpenSSL:

openssl genrsa -out key.pem 2048
openssl req -new -sha256 -key key.pem -out key.csr

4.5 如何取得一个收费证书?

如果你想要一个收费的,目前最出名的网站是 Let’s Encrypt – 收费的 SSL/TLS 证书 (letsencrypt.org)。他们会给你一个收费网站的证书。随着工夫的推移,取得证书的老本仿佛会更低。还有收费证书颁发机构的倡议。所以当初,你能够付费应用 Comodo 或 DigiCert 等网站,也能够抉择收费路线。

4.6 证书链(Certificate Chain)

证书不会间接由证书颁发机构签订; 这是一种建设起来的信赖链。如果你有一个证书,它通常是由一个两头证书颁发机构签订的,而这个两头证书颁发机构是由真正的证书颁发机构签订的。

在这种状况下,并不是所有的浏览器都必须晓得链中的下一个证书是什么,并且浏览器实际上只与顶部绑定(真正的脱机根证书)。因而,当你取得一个证书时,你还须要领有整个信赖链。

通常 CA 会给你这个证书链链,在 CA 没有给你的证书链状况下你能够通过一些工具去创立。

三人行, 必有我师; 常识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

正文完
 0