nginx 配置https

news2025/2/28 0:23:35

参考文档:nginx 文档 -- nginx官网|nginx下载安装|nginx配置|nginx教程 

配置 HTTPS 服务器

HTTPS 服务器优化
SSL 证书链
单个 HTTP/HTTPS 服务器
基于名称的 HTTPS 服务器
具有多个名称
的 SSL 证书 服务器名称指示
兼容性

要配置 HTTPS 服务器,ssl参数 必须在 server 块中的侦听套接字上启用, 并且应指定服务器证书和私钥文件的位置:

server {
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.crt;
    ssl_certificate_key www.example.com.key;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ...
}

服务器证书是一个公共实体。 它被发送到连接到服务器的每个客户端。 私钥是一个安全实体,应存储在文件中 受限访问,但是,它必须可由 nginx 的主进程读取。 私钥可以交替存储在与证书相同的文件中:

    ssl_certificate     www.example.com.cert;
    ssl_certificate_key www.example.com.cert;

在这种情况下,还应限制文件访问权限。 尽管证书和密钥存储在一个文件中, 仅将证书发送到客户端。

指令 ssl_protocols 和 ssl_ciphers 可用于限制连接 以仅包含 SSL/TLS 的强版本和密码。 默认情况下,nginx 使用 “ssl_protocols TLSv1.2 TLSv1.3” 和”ssl_ciphers HIGH:!aNULL:!MD5”, 因此,通常不需要显式配置它们。 请注意,这些指令的默认值已更改多次。

HTTPS 服务器优化

SSL作会消耗额外的 CPU 资源。 在多处理器系统上,应该运行多个工作进程, 不少于可用 CPU 内核数。 CPU 最密集的作是 SSL 握手。 有两种方法可以最大程度地减少每个客户端的这些作数: 第一种是通过启用 keepalive 连接来发送多个 请求通过一个连接,第二个连接是重用 SSL 会话 参数来避免并行和后续连接的 SSL 握手。 会话存储在 worker 之间共享的 SSL 会话缓存中 并由 ssl_session_cache 指令配置。 1 MB 的缓存包含大约 4000 个会话。 默认缓存超时为 5 分钟。 可以使用 ssl_session_timeout 指令来增加它。 以下是针对多核系统优化的配置示例 具有 10 MB 共享会话缓存:

worker_processes auto;

http {
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;

    server {
        listen              443 ssl;
        server_name         www.example.com;
        keepalive_timeout   70;

        ssl_certificate     www.example.com.crt;
        ssl_certificate_key www.example.com.key;
        ssl_protocols       TLSv1.2 TLSv1.3;
        ssl_ciphers         HIGH:!aNULL:!MD5;
        ...

SSL 证书链

某些浏览器可能会抱怨由知名 证书颁发机构,而其他浏览器可能会接受该证书 没有问题。 发生这种情况是因为颁发机构已对服务器证书进行签名 使用证书中不存在的中间证书 分布式的已知可信证书颁发机构的基础 使用特定的浏览器。 在这种情况下,颁发机构会提供一组链式证书 该证书应连接到签名的服务器证书。 服务器证书必须出现在链式证书之前 在合并的文件中:

$ cat www.example.com.crt bundle.crt > www.example.com.chained.crt

生成的文件应在 ssl_certificate 指令中使用:

server {
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.chained.crt;
    ssl_certificate_key www.example.com.key;
    ...
}

如果服务器证书和捆绑包在错误的 order 时,nginx 将无法启动并显示错误消息:

SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed
   (SSL: error:0B080074:x509 certificate routines:
    X509_check_private_key:key values mismatch)

因为 nginx 尝试将私钥与 bundle 的 第一个证书,而不是服务器证书。

浏览器通常存储它们接收的中间证书 并且由受信任的机构签名,因此积极使用浏览器 可能已经拥有所需的中间证书,并且 不能抱怨发送的证书没有链式捆绑包。 为了确保服务器发送完整的证书链, 这openssl命令行实用程序,例如:

$ openssl s_client -connect www.godaddy.com:443
...
Certificate chain
 0 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US
     /1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc
     /OU=MIS Department/CN=www.GoDaddy.com
     /serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b)
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.
     /OU=http://certificates.godaddy.com/repository
     /CN=Go Daddy Secure Certification Authority
     /serialNumber=07969287
 1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.
     /OU=http://certificates.godaddy.com/repository
     /CN=Go Daddy Secure Certification Authority
     /serialNumber=07969287
   i:/C=US/O=The Go Daddy Group, Inc.
     /OU=Go Daddy Class 2 Certification Authority
 2 s:/C=US/O=The Go Daddy Group, Inc.
     /OU=Go Daddy Class 2 Certification Authority
   i:/L=ValiCert Validation Network/O=ValiCert, Inc.
     /OU=ValiCert Class 2 Policy Validation Authority
     /CN=http://www.valicert.com//emailAddress=info@valicert.com
...

使用  SNI 测试配置时, 请务必指定 -servername选择 如 openssl默认情况下不使用 SNI。

在此示例中,www.GoDaddy.com服务器证书 #0 由颁发者签名 (“i”),它本身就是证书 #1 的主题, 它由颁发者签名,该颁发者本身就是证书 #2 的使用者, 它由知名颁发者 ValiCert, Inc. 签名,其证书存储在浏览器的内置 证书基础(位于 Jack 建造的房子里)。

如果尚未添加证书捆绑包,则仅添加服务器证书 #0 将显示。

单个 HTTP/HTTPS 服务器

可以配置一个服务器来处理 HTTP 和 HTTPS 请求:

server {
    listen              80;
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.crt;
    ssl_certificate_key www.example.com.key;
    ...
}

在 0.7.14 之前,无法有选择地为 单独的侦听套接字,如上所示。 SSL 只能使用  ssl 指令为整个服务器启用 使得无法设置单个 HTTP/HTTPS 服务器。 这 ssl listen 指令的参数 已添加以解决该问题。  ssl 指令的使用 因此,不鼓励使用。

基于名称的 HTTPS 服务器

配置两个或多个 HTTPS 服务器时会出现一个常见问题 侦听单个 IP 地址:

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

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

通过此配置,浏览器接收默认服务器的证书 即www.example.com无论请求的服务器名称如何。 这是由 SSL 协议行为引起的。 SSL 连接是在浏览器发送 HTTP 请求之前建立的 nginx 不知道请求的服务器的名称。 因此,它可能只提供默认服务器的证书。

解决问题的最古老、最可靠的方法 是为每个 HTTPS 服务器分配一个单独的 IP 地址:

server {
    listen          192.168.1.1:443 ssl;
    server_name     www.example.com;
    ssl_certificate www.example.com.crt;
    ...
}

server {
    listen          192.168.1.2:443 ssl;
    server_name     www.example.org;
    ssl_certificate www.example.org.crt;
    ...
}

具有多个名称的 SSL 证书

还有其他方法允许共享单个 IP 地址 在多个 HTTPS 服务器之间。 但是,它们都有其缺点。 一种方法是使用具有多个名称的证书 SubjectAltName 证书字段,例如www.example.comwww.example.org. 但是,SubjectAltName 字段长度是有限的。

另一种方法是使用带有通配符名称的证书,例如*.example.org. 通配符证书保护指定域的所有子域, 但只是在一个层面上。 此证书匹配www.example.org,但不匹配example.orgwww.sub.example.org. 这两种方法也可以结合使用。 证书可以在 SubjectAltName 字段,例如example.org*.example.org.

最好放置一个具有多个名称的证书文件,并且 其私有密钥文件在 HTTP 配置级别 要在所有 服务器中继承其单个内存副本:

ssl_certificate     common.crt;
ssl_certificate_key common.key;

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

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

服务器名称指示

在单个 HTTPS 服务器上运行多个 HTTPS 服务器的更通用的解决方案 IP 地址为 TLS 服务器名称指示扩展(SNI、RFC 6066)、 它允许浏览器在 SSL 握手期间传递请求的服务器名称 因此,服务器将知道它应该使用哪个证书 对于连接。 SNI 目前大多数现代浏览器都支持,但某些旧客户端或特殊客户端可能不支持 SNI。

SNI 中只能传递域名, 但是,某些浏览器可能会错误地传递服务器的 IP 地址 作为其名称(如果请求包含文本 IP 地址)。 我们不应该依赖这个。

为了在 nginx 中使用 SNI,它必须在 构建 nginx 二进制文件时使用的 OpenSSL 库以及 在运行时动态链接到的库。 如果 OpenSSL 是使用配置选项 “--enable-tlsext” 构建的,则从 0.9.8f 版本开始支持 SNI。从 OpenSSL 0.9.8j 开始,此选项默认启用。 如果 nginx 是使用 SNI 支持构建的,那么 nginx 将显示此内容 当使用 “-V” 开关运行时:

$ nginx -V
...
TLS SNI support enabled
...

但是,如果启用了 SNI 的 nginx 动态链接到 一个不支持 SNI 的 OpenSSL 库,nginx 会显示警告:

nginx was built with SNI support, however, now it is linked
dynamically to an OpenSSL library which has no tlsext support,
therefore SNI is not available

兼容性

  • SNI 支持状态已由“-V”开关显示 自 0.8.21 和 0.7.62 起。
  • ssl从 0.7.14 开始支持 listen 指令的参数。 在 0.8.21 之前,它只能与default参数。
  • 从 0.5.23 开始支持 SNI。
  • 从 0.5.6 开始支持共享 SSL 会话缓存。

  • 版本 1.27.3 及更高版本:默认 SSL 协议为 TLSv1.2 和 TLSv1.3(如果 OpenSSL 库支持)。 否则,当使用 OpenSSL 1.0.0 或更早版本时, 默认 SSL 协议为 TLSv1 和 TLSv1.1。
  • 版本 1.23.4 及更高版本:默认 SSL 协议为 TLSv1, TLSv1.1、TLSv1.2 和 TLSv1.3(如果 OpenSSL 库支持)。
  • 版本 1.9.1 及更高版本:默认 SSL 协议为 TLSv1, TLSv1.1 和 TLSv1.2(如果 OpenSSL 库支持)。
  • 版本 0.7.65、0.8.19 及更高版本:默认 SSL 协议为 SSLv3、TLSv1、 TLSv1.1 和 TLSv1.2(如果 OpenSSL 库支持)。
  • 版本 0.7.64、0.8.18 及更早版本:默认 SSL 协议为 SSLv2、 SSLv3 和 TLSv1。

  • 版本 1.0.5 及更高版本:默认 SSL 密码为 “HIGH:!aNULL:!MD5”.
  • 版本 0.7.65、0.8.20 及更高版本:默认 SSL 密码为 “HIGH:!ADH:!MD5”.
  • 版本 0.8.19:默认的 SSL 密码是 “ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM”.
  • 版本 0.7.64、0.8.18 及更早版本:默认 SSL 密码为
    ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP”.

参考文档:nginx 文档 -- nginx官网|nginx下载安装|nginx配置|nginx教程 

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

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

相关文章

mapbox添加自定义图片绑定点击事件,弹窗为自定义组件

一、首先构建根据后端返回的数据构建geojson格式的数据,点位的geojson数据格式: {"type": "FeatureCollection","features": [{"type": "Feature","geometry": {"type": "…

车载DoIP诊断框架 --- 连接 DoIP ECU/车辆的故障排除

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

嵌入式开发:傅里叶变换(4):在 STM32上面实现FFT(基于STM32L071KZT6 HAL库+DSP库)

目录 步骤 1:准备工作 步骤 2:创建 Keil 项目,并配置工程 步骤 3:在MDK工程上添加 CMSIS-DSP 库 步骤 5:编写代码 步骤 6:配置时钟和优化 步骤 7:调试与验证 步骤 8:优化和调…

vscode/cursor+godot C#中使用socketIO

在 Visual Studio Code(VS Code)中安装 NuGet 包(例如SocketIOClient),你可以通过以下几种方法: 方法 1:使用dotnet cli 打开终端:在 VS Code 中按下Ctrl 或者通过菜单View -> Terminal打开终端。 导…

应用的负载均衡

概述 负载均衡(Load Balancing) 调度后方的多台机器,以统一的接口对外提供服务,承担此职责的技术组件被称为“负载均衡”。 负载均衡器将传入的请求分发到应用服务器和数据库等计算资源。负载均衡是计算机网络中一种用于优化资源利…

区块链仿真工具SimBlock使用

1. Environment requirements SimBlock 可以在 Windows、MacOS、Ubuntu Linux 或任何支持 Java 的 Unix 平台上运行。 它需要以下版本的 JDK 和 Gradle。 请注意,SimBlock 的仓库中包含 Gradle Wrapper,因此您也可以自动安装 Gradle(我们稍…

面试八股文--数据库基础知识总结(2) MySQL

本文介绍关于MySQL的相关面试知识 一、关系型数据库 1、定义 关系型数据库(Relational Database)是一种基于关系模型的数据库管理系统(DBMS),它将数据存储在表格(表)中,并通过表格…

江协科技/江科大-51单片机入门教程——P[1-3] 单片机及开发板介绍

前言:本节主要的任务是了解一下 51 单片机和所用的普中51开发板。 目录 一、单片机介绍 二、单片机的应用领域 三、STC89C52单片机 四、命名规则 五、单片机内部拆解 六、单片机内部结构图 七、单片机管脚图 八、单片机最小系统 九、开发板介绍 十、开发…

【Uniapp-Vue3】导入uni-id用户体系

在uniapp官网的uniCloud中下载uni-id用户体系 或者直接进入加载,下载地址:uni-id-pages - DCloud 插件市场 进入以后下载插件,打开HbuilderX 选中项目,点击确定 点击跳过 点击合并 右键uniCloud文件夹下的database文件夹&#x…

如何免费使用稳定的deepseek

0、背景: 在AI辅助工作中,除了使用cursor做编程外,使用deepseek R1进行问题分析、数据分析、代码分析效果非常好。现在我经常会去拿行业信息、遇到的问题等去咨询R1,也给了自己不少启示。但是由于官网稳定性很差,很多…

基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释

基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释,结合理论与实际操作说明: 一、三级视图核心概念 数据库的三级视图是 ANSI/SPARC 体系结构的核心思想,MySQL 的实现逻辑如下: …

easyexcel和poi同时存在版本问题,使用easyexcel导出excel设置日期格式

这两天在使用easyexcel导出excel的时候日期格式全都是字符串导致导出的excel列无法筛选 后来调整了一下终于弄好了,看一下最终效果 这里涉及到easyexcel和poi版本冲突的问题,一直没搞定,最后狠下心来把所有的都升级到了最新版,然…

取topN不同算法的实现的性能差别

背景 最近在实现一个需求,需要对大量数据中排序出前N,最暴力的方法肯定是直接全量排序。这里很明显是可以不用全量排序的,取前N,我们自然而然可以想到一个算法——堆排序。 一开始自己先写好了一版,后来想起&#xff…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.1.2典型应用场景:日志分析、实时搜索、推荐系统

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 为什么选择Elasticsearch?——典型应用场景深度解析1. 引言2. 日志分析:海量数据的实时洞察2.1 行业痛点2.2 ES解决方案关键技术实现: 2.…

Spring Cloud Alibaba学习 3- Sentinel入门使用

Spring Cloud Alibaba学习 3- Sentinel入门使用 中文文档参考:Sentinel中文文档 一. SpringCloud整合Sentinel 1.1 下载Sentinel-Dashboard Sentinel下载地址:Sentinel-Dashboard 到下载目录,cmd输入 java -jar sentinel-dashboard-1.8…

使用DeepSeek/chatgpt等AI工具辅助网络协议流量数据包分析

随着deepseek,chatgpt等大模型的能力越来越强大,本文将介绍一下deepseek等LLM在分数流量数据包这方面的能力。为需要借助LLM等大模型辅助分析流量数据包的同学提供参考,也了解一下目前是否有必要继续学习wireshark工具以及复杂的协议知识。 pcap格式 目…

C语言 --- 经典习题1

C语言 --- 经典习题1 第 一 题 - - - 交 换 两 个 整 数 的 值(四 种 方 法)第 二 题 - - - 最 大 公 约 数 和 最 小 公 倍 数 之 和总结 💻作者简介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言 &#x1…

自定义mybatis拦截器,在springboot项目中不起作用的解决方法

自定义mybatis拦截器,在springboot项目中不起作用的解决方法 自定义mybatis拦截器,在若依springboot项目中不起作用的原因 找到 MyBatisConfig 配置类,引入自定义配置 在sqlSessionFactory中添加自定义拦截器,就可以正常使用了…

记录一下在k3s快速创建gitlab

废话不多说,直接上配置文件 需要修改的地方(备注都有写): 1.命名空间 namespace 2. claimName 文件挂载 Deployment kind: Deployment apiVersion: apps/v1 metadata:name: gitlabnamespace: cicd # 替换为您的命名空间la…

AWQ和GPTQ量化的区别

一、前言 本地化部署deepseek时发现,如果是量化版的deepseek,会节约很多的内容,然后一般有两种量化技术,那么这两种量化技术有什么区别呢? 二、量化技术对比 在模型量化领域,AWQ 和 GPTQ 是两种不同的量…