深入浅出学习透析Nginx服务器的基本原理和配置指南「Https安全控制篇」

news2024/11/17 5:41:01

Https反向代理

之前的内容中我们主要针对于一些对安全性要求比较高的站点,可能会使用HTTPS(一种使用SSL通信标准的安全HTTP协议),针对于HTTP 协议和SSL标准相信大家都知道了,在这里我就不为大家进行介绍了,如果需要了解,大家可以查看一下相关的资料哈,但是对于使用Nginx配置https需要了解一下基础内容的。

生产环境一般都是购买的商业版SSL证书,本文主要是将自己配置Nginx https证书的过程记录。我们开发过程的时候一般采用自制SSL证书。Nginx实现https需要http_ssl_module模块支持,该模块是默认编译模块,不需要我们再次编译。

Https反向代理的配置规则

  • HTTPS的默认端口号是443,不同于HTTP的默认端口(80)
  • SSL 标准需要引入安全证书,所以在Nginx.conf中你需要指定证书和它对应的 key
  • 其他和http反向代理基本一样,只是在Server部分配置有些不同。

之前案例的Http配置模板

以下是我们之前章节案例的配置基本模板信息,用于作为我们https模式的改造的标准话模板参考。

http {
    upstream nginxServerConfig {
        least_conn;
        server www.address1.com; // 或者ip+端口 , 不需要加入http/https前缀
        server www.address2.com;
        server www.address3.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://loadBalanceServer;
        }
    }
}

配置 HTTPS 服务器

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

启用 SSL 功能

添加ssl指令的参数on,代表开启状态,目前新版本已经不需要进行指定了,默认可以自己检测和开启状态,此处只是说明以下有这个指令介绍。

ssl on;

注意:在 0.7.14 之前,无法为各个 socket 选择性地启用 SSL,如上所示。只能使用 ssl 指令为整个服务器启用 SSL,从而无法设置单个 HTTP/HTTPS 服务器。可以通过添加 listen 指令的 ssl 参数来解决这个问题。因此,不建议在现在的版本中使用 ssl 指令

监听默认端口修改

上面说的配置:HTTPS的默认端口号是443,不同于HTTP的默认端口(80),需要将原有的80端口的监听443端口。443为知名端口号,主要用于HTTPS协议。

需要将 listen 80; 改为  listen  443 ssl;

并且需要再后面再添加一个 ssl标识,代表着监听此类端口为Https模式协议机制。

制作SSL证书文件

我们都知道在公钥密码学(也称为非对称密码术)中,加密机制依赖于两个相关的密钥,一个公钥和一个私钥。公钥用于加密消息,而只有私钥的所有者才能解密消息。而针对于Https加密机制,需要引入证书,而证书就是针对于公钥和私钥的载体。所以我们需要配置对应的ssl证书文件。

SSL证书,就是遵守SSL安全套接层协议的服务器数字证书,由浏览器受信任的根证书颁发机构在验证服务器身份后颁发,具有网站身份验证和加密传输等功能。SSL证书并不是什么高深的技术产品,只需要成功申请下发后,安装到网站服务器即可。当你访问一个网站时,如果发现浏览器的地址栏中显示的是“https://”(绿色小锁图标),就说明这个网站已经安装部署了SSL证书

  • PEM:用ASCLL(BASE64)编码的证书;PEM扩展名用于不同类型的X.509v3文件,这些文件包含前缀为“-BEGIN …”行的ASCII(Base64)数据。

  • CER/CRT:存放公钥,没有私钥(编码方式不一定,有可能是.pem,也有可能是.der)。

在制作SSL证书之前需要线生成对应的私钥文件key信息数据。

openssl生成RSA私钥文件

openssl  alexlibo  -out mysecurity.key 2048

生成对应的私钥文件的基本结构信息如下:

在这里插入图片描述

当然也可以参考使用 acme.sh 给 Nginx 安装 Let’ s Encrypt 提供的免费 SSL 证书,生成对应的较为专业的SSL证书。针对于该脚本【acme.sh】的github仓库地址https://github.com/acmesh-official/acme.sh,有兴趣的小伙伴可以试试看。

生成pem文件

PEM文件格式

PEM格式通常用于数字证书认证机构(Certificate Authorities,CA),扩展名为.pem, .crt, .cer, and .key。内容为Base64编码的ASCII码文件,有类似"-----BEGIN CERTIFICATE-----" 和 "-----END CERTIFICATE-----"的头尾标记。服务器认证证书,中级认证证书和私钥都可以储存为PEM格式(认证证书其实就是公钥)。Apache和类似的服务器使用PEM格式证书。

openssl  req  -new -x509  -days 3650  -key mysecurity.key  -out mysecurity.pem
PEM文件内容

以下就是类似的pem文件的内容

添加对应的SSL证书

将生成的key、pem文件拷贝到nginx的conf目录下,为了管理多个SSL证书,可以在nginx的 conf目录下建立cert目录专门存放SSL证书相关文件。

设置ssl证书文件位置

我们采用在server指令块内部定义【ssl_certificate 指令】对应的value值,sl_certificate处写我们生成的pem文件,一般我们常见证书文件格式为:crt/pem。

ssl_certificate      path/mysecurity.pem;

或者

ssl_certificate      path/mysecurity.crt;

这里注意以下:对应的证书位置是针对于nginx,conf文件的相对位置或者觉得路径也可以。

设置ssl证书私钥文件的位置

ssl_certificate_key写我们生成的key文件。配置完成后检查nginx的配置文件 然后重启Nginx.

ssl_certificate_key path/mysecurity.key;

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

ssl_certificate     xxx.cert;
ssl_certificate_key xxx.cert;

这种情况下,文件的访问也应该被限制。虽然证书和密钥存储在一个文件中,但只有证书能被发送给客户端。

SSL指令来限制连接

ssl_protocols 和 ssl_ciphers 指令来限制连接,使其仅包括 SSL/TLS 的版本和密码

ssl_protocols

默认情况下,Nginx 使用版本为 ssl_protocols TLSv1 TLSv1.1 TLSv1.2,如下所示。

ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers

默认情况下,Nginx密码为 ssl_ciphers HIGH:!aNULL:!MD5

ssl_ciphers HIGH:!aNULL:!MD5
ssl_prefer_server_ciphers

指定是否使用服务器的 SSL 密码,on为开启状态

ssl_prefer_server_ciphers  on;

通常不需要配置它们以上两者的值。请注意,这些指令的默认值已经被更改多次。

最终案例展示
server {
    listen              443 ssl;
    server_name       www.address1.com;
    ssl_certificate      path/mysecurity.pem;
    ssl_certificate_key path/mysecurity.key;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ...
}

ssl配置参数(选择性配置)

ssl的会话相关的配置
ssl_session_cache

设置ssl的session会话的缓存

启用 SSL Session 缓存可以大大减少 TLS 的反复验证,减少 TLS 握手的 roundtrip。虽然 session 缓存会占用一定内存,但是用 1M 的内存就可以缓存 4000 个连接,可以说是非常非常划算的。对于绝大多数网站和服务,要达到 4000 个同时连接本身就需要非常非常大的用户基数,因此可以放心开启。

ssl_session_cache    shared:SSL:1m;
  • shared:SSL:1m:代表着缓存属于SSL之内进行共享,总体大小为1M。
ssl_session_timeout

设置ssl的会话超时时间为5分钟

ssl_session_timeout  5m; 

同时建立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;
    ...
}

基于名称的 HTTPS 服务器

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

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

使用了此配置,浏览器会接收默认服务器的证书,即 www.address1.com,而无视所请求的服务器名称。这是由 SSL 协议行为引起的。SSL连接在浏览器发送 HTTP 请求之前建立,nginx 并不知道请求的服务器名称。因此,它只能提供默认服务器的证书。最古老、最强大的解决方法是为每个 HTTPS 服务器分配一个单独的 IP 地址:

server {
    listen          192.168.1.1:443 ssl;
    server_name     www.address1.com;
    ssl_certificate address1.crt;
    ...
}
server {
    listen          192.168.1.2:443 ssl;
    server_name     www.address1.org;
    ssl_certificate address1.crt;
    ...
}

一般情况下如果作为统一的公私钥配置,那么最好是将证书文件与名称、私钥文件放置在 http 级配置,以便在所有服务器中继承其单个内存副本,如下所示

ssl_certificate     mysecurity.crt;
ssl_certificate_key mysecurity.key;
server {
    listen          443 ssl;
    server_name     www.address1.com;
    ...
}
server {
    listen          443 ssl;
    server_name     www.address2.org;
    ...

Https服务配置模式最终案例

  #HTTP服务器
  server {
      #监听443端口。443为知名端口号,主要用于HTTPS协议
      listen       443 ssl;
      #定义使用www.xx.com访问
      server_name  www.xx.com;
      #ssl证书文件位置(常见证书文件格式为:crt/pem)
      ssl_certificate      cert.pem;
      #ssl证书key位置
      ssl_certificate_key  cert.key;
      #ssl配置参数(选择性配置)
      ssl_session_cache    shared:SSL:1m;
      ssl_session_timeout  5m;
      #数字签名,此处使用MD5
      ssl_ciphers  HIGH:!aNULL:!MD5;
      ssl_prefer_server_ciphers  on;
      location / {
          root   /root;
          index  index.html index.htm;
      }
  }

HTTPS 服务器优化分析

  1. SSL 操作会消耗额外的 CPU 资源。在多处理器系统上,应该运行多个 工作进程(worker process),不得少于可用 CPU 核心的数量。大多数 CPU 密集型操作是发生在 SSL 握手时。有种方法可以最大程度地减少每个客户端执行这些操作的次数。

    • keepalive指令不会限制一个nginx worker进程到upstream服务器连接的总数量。connections参数应该设置为一个足够小的数字来让upstream服务器来处理新进来的连接。 connections参数设置每个worker进程在缓冲中保持的到upstream服务器的空闲keepalive连接的最大数量.当这个数量被突破时,最近使用最少的连接将被关闭。

启用 keepalive 连接,通过一个连接来发送多个请求,第二个是复用 SSL 会话参数,避免相同的和后续的连接发生 SSL 握手。会话存储在工作进程间共享的 SSL 会话缓存中,由 ssl_session_cache 指令配置。1MB 缓存包含约 4000 个会话。默认缓存超时时间为 5 分钟,可以用 ssl_session_timeout 指令来增加。以下是一个优化具有 10MB 共享会话缓存的多核系统的配置示例

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

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

相关文章

共建“医疗合规科技实验室”,美创科技实力护航医疗数据安全

11月15日-17日,由工业和信息化部、深圳市人民政府主办,中国互联网协会、广东省通信管理局、深圳市工业和信息化局等单位承办的2022中国互联网大会隆重召开。 在互联网医疗健康合规发展论坛上,医疗合规科技实验室合作伙伴计划正式启动&#xf…

scau Java综合性实验之Java源程序分析程序

1. 编写一个Java应用程序,实现对某个目录中的所有Java源程序文件(包含该目录的子目录中的源程序文件)进行统计。统计内容包括: (1) 目录中每个源程序文件的总行数和空白行数,文件的字节数; (2) 目录中所有源…

ADB调试--详细教程(附华为手机无法显示设备解决方法)

终端打开开发者模式,用数据线连接电脑,然后按照下面的步骤操作 1、开启开发者选项: 设置->关于设备->版本号(连续点击5次) 2、打开USB调试 在开发者选项中,找到USB调试,将此打开。 3、…

作为资深程序民工怎么能被性能优化难倒!原理与实战齐飞,源自大厂自然更专业!

性能优化是一个很复杂的工作,且充满了不确定性。它不像Java业务代码,可以一次编写到处运行(write once, run anywhere),往往一些我们可能并不能察觉的变化,就会带来惊喜/惊吓。能够全面的了解并评估我们所负责应用的性能&#xff…

全渠道商城授权管控经销商,渠道商管理系统助力医药企业快速扩大渠道规模

随着医改的稳步推进,医药行业传统的以销售为主的扩张模式难以为继,国内药企面临创新转型。如何探寻医药数字化营销方法论,如何把握政策机遇和用户需求,利用数字化推动医药创新渠道破局,已成业内关注的重点。 后疫情时…

如何在win11中用双硬盘或移动硬盘装Ubuntu 20.04 双系统

首先明确一下思路,这个多硬盘的安装方式与单硬盘的方式没什么本质区别 下面介绍具体的方法: 1.下载Ubuntu系统镜像、制作系统盘 1.1 下载镜像 ubuntu20.04镜像下载:ubuntu20.04官网,点击进入下载 现在最新版是 Ubuntu 22.04.1…

ZX297520V3T:Codec NAU88C22驱动调试

一、音频驱动框架 ALSA(Advanced Linux Sound Architecture)是目前linux的主流音频体系结构。ALSA不仅在内核设备驱动层提供了alsa-driver,同时在应用层为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。为了方便调试,ALSA也提…

Spring~五种存储Bean对象的类注解、方法注解(@Bean)以及Bean对象的获取

目录 五种存储Bean对象的类注解 ​Controller Service Repository Component Configuration 方法注解Bean 使用Bean注解的常见问题 当一个类型有多个实例对象,使用类型获取就会报错 在容器中找不到Bean,不论通过什么方式来获取Bean对象都会报…

建设一个互联网医院系统要花多少钱?

建设一个互联网医院系统要花多少钱?很多人在筹备调研互联网医院建设后,仍然有很多问题答案不清楚,今天就给大家来聊一聊。 其实互联网医院看似简单,实则是一个较为复杂的过程,要想合法合规的开展线上诊疗业务&#x…

雷电模拟器dnconsole命令汇总

雷电模拟器之文件操作 删除相册中的文件 ldconsole adb --index 0 --command "shell rm /sdcard/DCIM/1.png" 雷电模拟器应用操作 假设启动名为test1的模拟器, 以抖音为例 : 判断应用是否安装: ldconsole adb --name test1 --co…

姿态识别+校准|视觉技术新突破

技术实现路径及优势 概述:通过2D图像序列加2D图像景深序列,利用复杂的3D重建算法与人体骨架模型的拟合还原姿态节点信息,进而对各种姿态进行准确的数学分析,达到准确高效识别姿态的效果;摆脱人脸3D训练样本真值依赖&am…

【输出重定向】Windows下 cmd 、powershell输出重定向

目录一、cmd和powershell二、什么是输入输出重定向三、语法及示例一、cmd和powershell 大家如果只用过Windows,可能cmd接触的相对多一点。按win r 输入cmd即可打开。我一般用的是powershell。 cmd:     cmd是command的缩写,即命令提示符。是提示命…

怎么手写转文字?借助这3款工具轻松实现

许多小伙伴在日常中会遇到需要把手写文字转换为电子版的情况,例如领导给一份手稿让你整理,亦或是平时自己随笔记录的一些内容想把它分享到平台上等等。但是手动逐字敲键盘输出太费时费神啦,所以今天要传授给大家一个好方法,那就是…

HTML5期末考核大作业,网站——青岛民俗 7页。 美丽家乡 学生旅行 游玩 主题住宿网页

👨‍🎓静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计👩‍🎓,一般的网页作业需要融入以下知识点:div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

LeetCode-808-分汤

1、动态规划法 我们可以利用二维数组dp[i][j]dp[i][j]dp[i][j]来记录当汤A的体积为i,汤B的体积为j时的概率。由于体积均为25的倍数,为了方便计算我们可以将所有体积都除以25。由于误差范围为10−510^{-5}10−5,我们可以计算得出当$n\ge179时…

Day08--自定义组件的插槽

1.什么是插槽 **************************************************************************************************************************************************************************************************************************** 2.单个插槽 我的操作&am…

一个小台灯 之 微信小程序开发日志

微信小程序开发日志 小程序只能使用https和后台服务器进行post请求和get请求,使用https的连接需要的微信小程序的后台对域名进行备份。 在备份的时候也只能通过域名,不能通过公网IP备份。 一、基础 微信小程序的一个界面主要分为四个文件 index.json…

剖析一下“抢茅台“脚本底层逻辑

本文作者:梁冬冬 前言: 今天你撸茅台了么👇? 撸茅台已经成为社会现象🙌,茶余饭后讨论的最佳实践😇 2022年双十一大促已经完美收官,兄弟姐妹克服种种困难与挑战… 备战的会议室忙碌…

用户规模持续上涨,外卖行业未来的发展趋势如何?还能从里盈利?

外卖跑腿行业随着互联网移动支付及网络的普及得到了高速发展,相关数据显示2022年外卖行业规模进一步上升至8117亿元,外卖市场发展速度增速加快,并且也带动了各大主流外卖平台的发展,在2021年外卖用户规模达5.44亿人,占…

从工厂打螺丝到月薪9.5k测试工程师,我该满足吗?

以前我比较喜欢小米那句“永远相信美好的事情即将发生”,后来发现如果不努力不可能有美好的事情发生! 初中毕业进厂5年,创业经商多次战败,为了生计辗转奔波 初中毕业后我就进了工厂,第一份工作是做模具加工。从500元一…