HTTPS基础原理和配置-3

news2025/2/26 6:14:23

书接上文:HTTPS 基础原理和配置 - 2,接下来介绍:

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

重要部分来了。如何使用这些选项并配置NGINX?

一、NGINX 的 HTTPS 配置

这里有一些基本的原语(或叫做指令),你可以使用:ssl_certificatessl_certificate_keyssl_protocolsssl_ciphers

1.1 NGINX 配置参数(OpenSSL)

在开始之前: NGINX 处理 TLS 的方式是使用 OpenSSL,我相信你已经在新闻中听说过这个库。它因 Heartbleed 和其他一些漏洞而闻名。它确实是最广泛使用的内置加密库。这是 NGINX 用于加密的。

因此,在服务器上要做的一件事是检查正在使用的 OpenSSL 版本。你可能不想使用 0.9.8 之类的版本。你希望在1.0.1p 或 1.0.2 范围内使用,因为多年来他们已经修复了许多 bug。你永远不知道下一个 OpenSSL 漏洞什么时候出现,但至少现在它是非常可靠的(1.0.1p)。它还拥有所有现代加密算法。

1.2 NGINX 配置证书链和私钥

所以,当你在 NGINX 中设置你的服务器部分时,ssl_certificate 就是你的证书链。这是你的证书加上所有的信任链一直到根证书。然后你还需要提供你的私钥。

ssl_certificate_key 就是你的私钥。

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
    ssl_dhparam /path/to/dhparam;

    # 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 on;
}

1.3 额外选项

你还可以添加一些与会话恢复有关的额外选项。如前所述,当你第一次建立 TLS 连接时,需要额外的两次往返,因为你必须完成整个握手和交换证书。如果你以前连接过一个客户端,并且他们已经缓存了会话传输所使用的密钥,那么你可以只恢复该会话。这是一个称为会话恢复的特性。

你只需要一个超时来说明你希望将会话保留多长时间,以及这些会话的缓存可以有多大。在本例中,默认是 10 MB 的会话;那应该够你用很长时间了。共享缓存是首选,因为这样你就可以在所有 NGINX worker 之间共享它们。

例如,如果你的一个 worker 是最初建立连接的那个,而第二个连接被建立到另一个 NGINX worker,你仍然可以恢复连接。还有另一个选项叫做「session ticket」。它只在 Chrome 内核浏览器和 Firefox 中使用,但本质上是一样的。你必须生成一个随机的 48 字节文件,但我建议暂时只使用会话缓存。

1.4 NGINX 的协议和密码配置

作为一个非常明显的下一步,你必须列出希望支持的协议和密码。在这种情况下,上文是 Mozilla 推荐的密码,以及从 1.2 版到 1.3 版的 TLS 协议。

1.5 其他

我提到过你如何协商你选择的密码; 你可以选择客户端的选择或服务器的选择。最好选择服务器的选择。这里有一个指令: ssl_prefer_server_ciphers——始终打开它。

1.6 同一证书多域

如果你有多个站点,并且它们使用相同的证书,那么你实际上可以分解 HTTP 定义。你可以在顶层使用 SSL 证书,在底层使用不同的服务器。这里你需要记住的一件事是如果你有 example.comexample.org ,你必须有一个证书对这两个名字都有效,这样才能工作。

ssl_certificate        multiSAN.crt;
ssl_certificate_key    multiSAN.key;

server {
    listen            443 ssl;
    server_name        www.example.com;
    ...
}

server {
    listen            443 ssl;
    server_name        www.example.org;
    ...
}

以上基本上就是为 NGINX 设置 HTTPS。

二、后端 HTTPS

更高级的话题是:如何使用 NGINX 作为其他 HTTPS 服务的代理?

后端加密

我们称之为后端加密。所以,你的访客访问你的 NGINX 服务器是完全加密的。NGINX 背后发生了什么? 在这种情况下,NGINX 必须充当浏览器访问你的后端服务。

2.1 NGINX 后端配置

这可以在 NGINX 中以类似的方式配置。也有类似于 ssl_protocolsssl_ciphers 的指令; 在本例中,你将它放在一个代理下。NGINX 作为客户端将使用 proxy_ssl_protocolsproxy_ssl_cipher 指令。

http {
    server {
        proxy_ssl_protocols        TLSv1.2 TLSv1.3;    # 协议
        proxy_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;    # 密码套件
        proxy_ssl_trusted_certificate    /etc/ssl/certs/trusted_ca_cert.crt;    # 受信任的 CA

        proxy_ssl_verify        on;
        proxy_ssl_verify_depth    2;
        proxy_ssl_session-reuse    on;
    }
}

我建议使用完全相同的密码套件和协议集。这里的主要区别是客户端对服务器进行身份验证。所以,在浏览器的情况下,你有一组你信任的证书颁发机构,而 NGINX 作为客户端,你也需要一组你信任的证书颁发机构。

2.2 受信任的 CA 的选项

你可以使用两种不同的理念来实现这一目标,一种是创建你自己的内部证书颁发机构并在内部管理它。这有点棘手,但它更便宜,也更容易管理,因为你可以为任何服务颁发证书,并将它们颁发给你拥有并完全控制的证书颁发机构。在这种情况下,proxy_ssl_trusted_certificate 将被设置为你的证书颁发机构。

或者,你可以使用我在上一篇文章中描述的相同技术。你可以为你所有的服务购买证书,然后如果你的NGINX需要信任它们,它可以信任浏览器信任的同一套证书颁发机构。

对于 Ubuntu,磁盘上有一个列表,里面包含了几乎所有平台的所有证书。但是,如果你正在构建一组需要相互通信的大型服务,那么就很难为这些域颁发证书。你必须向证书颁发机构证明所有权才能实际获得证书。

我推荐内部 CA 机制。最困难的部分是——如何保证证书颁发机构的安全? 如何保证证书颁发机构的私钥的安全? 你可以通过使用脱机计算机和特殊管理员来实现这一点,但无论哪种情况,都存在一些挑战。

三、检查配置

NGINX 设置了 HTTPS。如何检查它的配置是否正确?

ssl labs 评分

SSL Labs 是人们最喜欢的网站检查工具之一。SSL Labs 是 Qualys 运营的一个网站; 你只要输入你的域名,它就会运行所有类型的浏览器,所有类型的 SSL 连接,它会告诉你哪些设置正确,哪些设置错误。

在本例中,我们检查了一个名为 badSSL.com 的网站,它列举了所有可能导致 HTTPS 配置混乱的不同方法。你可以用 SSL Labs 扫描每一个,它会告诉你每一个有什么问题。在本例中,给出的等级是 C,因为它支持 SSL v3.0。

这里还提到了其他一些东西,你们可以修改,但在我如何设置 NGINX 的描述中,如果你这样设置,你基本上会得到 A。这意味着证书协议支持、密钥交换和密码强度都是顶级的。

ssl labs 评分

3.1 CFSSL 扫描

这对互联网网站非常有效; 如果你有防火墙或 NGINX 后面的服务,CloudFlare 构建了这个叫做 CFSSL 扫描的工具。你可以在内部基础架构中使用它; 它是开源的,在 cloudflare/cfssl: CFSSL: Cloudflare's PKI and TLS toolkit (github.com)上。它将做本质上与 SSL Labs 相同的事情,只是在你的基础设施内。它会告诉你什么是对的,什么是错的。

CFSSL 扫描

四、加分项:配置 HSTS

之前提到过得到 A 的方法,那么 A+ 呢?事实证明,SSL Labs 就会给一个 A+,当你有了一个叫做 HSTS (Hypertext Strict Transport Security, 超文本严格传输安全) 的特性。

4.1 什么是 HSTS?

本质上,这是一个 HTTP 头,你可以添加到你的请求,告诉浏览器总是通过 HTTPS 访问这个站点。即使他们最初是通过 HTTP 访问的,也总是重定向到 HTTPS。

然而,这实际上有一点危险,因为如果你的 SSL 配置中断或证书过期,那么访问者将无法访问该站点的纯 HTTP 版本。你还可以做一些更高级的事情。就是将你的站点添加到预加载列表中。Chrome 和火狐浏览器都有一个列表,所以如果你注册了,他们就永远不会通过 HTTP 访问你的网站。

4.2 为什么要这么做?

SSL Labs 将给你一个 A+ 如果其他一切正确的。你需要正确地设置 includeSubdomains 的 HSTS(这意味着它适用于所有子域名),并且它必须有至少 6 个月的有效期,这使得它非常危险。这是因为如果你改变了你的配置,浏览器将会记住这六个月。所以你必须保持你的 HTTPS 配置正常工作。

这是一件好事,因为它可以防止任何人在中间修改它。使用 HSTS,浏览器甚至不会有机会访问你的 HTTP 端,因此人们不会在这方面干扰你的站点。所以 HSTS 是一个非常可靠的方法。

4.3 风险

正如我提到的,有几个风险:

  • 阻止人们通过 HTTP 访问站点
  • 如果 HTTPS 配置异常(比如证书过期),站点就无法访问了

4.4 NGINX 配置 HSTS

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
    ssl_dhparam /path/to/dhparam;

    # 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;

    # HSTS (ngx_http_headers_module is required) (15768000 seconds)
    add_header Strict-Transport-Security "max-age=15768000" always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    # replace with the IP address of your resolver
    resolver 127.0.0.1;
}

要设置它,只需在 NGINX 的服务器配置中添加一个头文件,上面写着 Strict-Transport-Security,并给它一个最大时间(max-age)。在本例中,它被设置为6个月(这是预加载列表所需的最低时间)。你还可以在这里添加其他指令,如:includeSubdomains和preload,这意味着可以接受这个指令并将其添加到预加载列表中。这就是得到 A+ 的方法。

五、又一加分项:配置 OCSP 装订(OCSP Stapling)

这是一些人喜欢使用的另一个附加功能,它实际上可以帮助加快连接速度。

5.1 什么是 OCSP Stapling

正如我前面提到的,建立一个TLS连接需要有很多来回的。我没有提到的是,这些证书不仅可以过期失效,还可以被吊销。

因此,如果你丢失了你的私钥,出现了漏洞,或者有其他人非法拥有了你的私钥,那么你必须去你的证书颁发机构并撤销这个密钥。有几种机制可以告诉浏览器证书已被吊销; 它们都有点粗略,但最流行的是 OCSP(Online Certificate Status Protocol,在线证书状态协议)。

发生的情况是: 当浏览器收到证书时,它还必须检查它是否被吊销了。于是它联系了证书颁发机构,问「这个证书还有效吗?」他们会回答「是」或「不是」。这本身就是另一组连接,你需要查找 CA 的 DNS,你需要连接到 CA,这对你的网站来说是额外的减速。

HTTPS 不只需要三次往返,你还需要 OCSP。因此,OCSP 装订允许服务器获取证书未过期的证明。在后台,获取这个表示「是的,证书是好的」的 OCSP 响应,然后将它放入握手中。这样客户端就不需要实际接触 CA 并获取它。

5.2 会快多少?

完整 HTTPS 网站访问过程示例如下:

  1. DNS(1334ms)
  2. TCP 握手(240ms)
  3. SSL 握手(376ms)
  4. 跟踪证书链(1011ms)
  5. 到 CA 的 DNS 记录(300ms)
  6. 到 CA 的 TCP (407ms)
  7. 到 CA 的 OCSP 第一次(598 ms)
  8. 到 CA 的 TCP 第二次(317ms)
  9. 到 CA 的 OCSP 第二次(444ms)
  10. 完成 SSL 握手(1270ms)

配置了 OCSP Stapling,上文的 5-9 步可以省略,这可以节省约 30% 的访问一个 HTTPS 网站的连接时间。

5.3 NGINX 配置 OCSP Stapling

见上文(4.4 NGINX 配置 HSTS),用 NGINX 也很容易设置。有一个 OCSP Stapling 的指令。装订验证(Stapling verify)是指在装订证书之后对其进行验证。正如我前面(2.2 受信任的 CA 的选项)提到的,使用代理,你必须信任 CA。你可以从 CA 获得一个文件,并通过可信证书部分添加到该文件中。

总结

以上就是配置 NGINX 和 OCSP 装订、HSTS 和 SSL 代理的方法。

正如我提到的,在2008年, TLS v1.2 是最新和最好的。近期,他们推出了新版本,TLS v1.3。

HTTPS 是一个不断变化的领域,我们的配置及最佳实践可能也需要进行相应调整。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GEE学习笔记八十八:在自己的APP中使用绘制矢量(上)

在GEE中尤其是自己的APP中调用绘制的矢量图形方法之前没有合适的方法,但是现在可以通过ui.Map.DrawingTools(...)以及ui.Map.GeometryLayer(...)结合来做。具体的API如下图: 在这一篇中我先通过一个简单的例子来展示一下使用这些API后可以实现什么效果&a…

C#底层库--日期扩展类(上周、本周、明年、前年等)

系列文章 C#底层库–记录日志帮助类 本文链接:https://blog.csdn.net/youcheng_ge/article/details/124187709 C#底层库–数据库访问帮助类(MySQL版) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886379 …

axios中的GET POST PUT PATCH,发送请求时params和data的区别

axios 中 get/post请求方式 1. 前言 最近突然发现post请求可以使用params方式传值,然后想总结一下其中的用法。 2.1 分类 经过查阅资料,get请求是可以通过body传输数据的,但是许多工具类并不支持此功能。 在postman中,选择get请…

以before为例 完成一个aop代理强化方法案例

观看本文 首先 您需要做好Spring aop的准备工作 具体可以参考我的文章 java Spring aop入门准备工作 首先 我们创建一个包 我这里叫 Aop 然后在Aop包下创建一个类 叫 User 参考代码如下 package Aop;public class User {public void add(){System.out.println("add....…

android kotlin 协程(三) 理解挂起,恢复以及job

android kotlin 协程(三) 理解挂起,恢复以及job 前言: 通过上两篇的基础入门,相信大家对协程api已经有了一个基本的影响,本篇开始尝试理解挂起于恢复. 本篇不涉及源码, 通过很多应用案例,来理解挂起于恢复! 协程执行流程理解 还是老套路,先来看原始效果 参考图1 在这里我们知…

电子技术——目录

电子技术——目录 第一章——信号与放大器 第二章——运算放大器 第三章——半导体器件 第四章——二极管 第五章——金属氧化物场效应晶体管 目录: MOS管的物理结构MOS管的CV特性MOS放大器基础MOS管的小信号模型基本MOS放大器配置MOS放大器的DC偏置分立MOS放…

传奇开服方法教程:传奇开服在哪些网站打广告?传奇发布站打广告技巧

传奇开服方法教程:传奇开服在哪些网站打广告?传奇发布站打广告技巧 纯分享经验以及方法:开传奇sf,成本最高的就是广告费用了,为了让服人气更高,主播和发布站相信你们都已经尝试了,上人效果如何你…

全网详解 .npmrc 配置文件:比如.npmrc的优先级、命令行,如何配置.npmrc以及npm常用命令等

文章目录1. 文章引言2. 简述.npmrc3. 配置.npmrc3.1 .npmrc配置文件的优先级3.2 .npmrc设置的命令行3.3 如何设置.npmrc4. 配置发布组件5. npm常用命令6. 重要备注6.1 yarn6.2 scope命名空间6.3 镜像出错1. 文章引言 今天在某低代码平台开发项目时,看到如下编译配置…

Java实现调用ChatGPT的相关接口(附详细思路)

目录1.0.简单版2.0.升级版2-1.call.timeout()怎么传入新的超时值2-2.timeout(10, TimeUnit.SECONDS)两个参数的意思,具体含义3.0.进阶版3-1.java.net.SocketTimeoutException: 超时如何解决4.0.终极版1.0.简单版 以下是一个使用 Java 实际请求 ChatGPT 的简单示例代…

EasyExcel详解-写Excel

一、注解使用注解很简单,只要在对应的实体类上面加上注解即可。ExcelProperty用于匹配excel和实体类的匹配,参数如下:名称默认值描述value空用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头orderInteger.MAX_VALUE…

硬件系统工程师宝典(6)-----如何减小信号串扰?

各位同学大家好,欢迎继续做客电子工程学习圈,今天我们继续来讲这本书,硬件系统工程师宝典。 上篇我们说到描述信号传输的过程的需要做好阻抗匹配,以减小信号的反射。今天我们来看看传输线之间的噪声干扰,那就是信号的…

rdma rocev2报文格式总结

格式如下: wireshark抓包,soft-roce(基于rocev2实现的)格式如下: 其实这里看着有点奇怪,ICRC是跟在Payload头后面的,不知道为什么抓包看到的却是在BTH头后面的,还有就是看不到FCS?? 其中BTH头的格式有…

极兔一面:Dockerfile如何优化?注意:千万不要只说减少层数

说在前面 在40岁老架构师 尼恩的读者交流群(50)中,面试题是一个非常、非常高频的交流话题。 最近,有小伙伴面试极兔时,遇到一个面试题: 如果优化 Dockerfile? 小伙伴没有回答好,只是提到了减少镜像层数。…

01背包问题 AcWing(JAVA)

有 N件物品和一个容量是 V的背包。每件物品只能使用一次。 第 i件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数,N&#xff…

数据结构与算法(一):概述

数据结构学了有一年左右的时间了,但是一直没有详细地总结一下,现在回想起来,感觉有些内容忘记了。所以接下来一段时间我将重新归纳总结一下,算是温故而知新了。 一、数据结构 1、定义 数据结构是计算机存储、组织数据的方式。在…

excel学习笔记-导入外部文件,报错,数值格式变换,日期格式的转化,求和快捷键,冻结窗格

这里写目录标题一、导入外部文件1.导入csv文件2.导入txt文件3.修改txt内容,需要刷新才能看见更改二、报错三、数值格式变换四、日期格式的转化五、ALT ,求和快捷键六、冻结窗格一、导入外部文件 1.导入csv文件 2.导入txt文件 3.修改txt内容,…

内网渗透(三十)之横向移动篇-利用远控工具向日葵横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

力扣sql简单篇练习(十六)

力扣sql简单篇练习(十六) 1 产品销售分析|| 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT p.product_id,sum(s.quantity) total_quantity FROM Product p INNER JOIN Sales s ON p.product_ids.product_id GROUP BY p.product_id1.3 运行截…

explain 每个列的含义

官网传送门:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html 实例表 DROP TABLE IF EXISTS actor;CREATE TABLE actor (id int(11) NOT NULL,name varchar(45) DEFAULT NULL,update_time datetime DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB DEFA…

【Java项目】基于Java+MySQL+Tomcat+maven+Servlet的个人博客系统的完整分析

✨哈喽,进来的小伙伴们,你们好耶!✨ 🛰️🛰️系列专栏:【Java项目】 ✈️✈️本篇内容:个人博客系统前后端分离实现! 🚀🚀个人代码托管github:博客系统源码地址&#xff…