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

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

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
复制代码

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

image.png


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



生成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文件的内容

image.png



添加对应的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 共享会话缓存的多核系统的配置示例




相关文章
|
5天前
|
存储 分布式计算 固态存储
阿里云2核16G、4核32G、8核64G配置云服务器租用收费标准与活动价格参考
2核16G、8核64G、4核32G配置的云服务器处理器与内存比为1:8,这种配比的云服务器一般适用于数据分析与挖掘,Hadoop、Spark集群和数据库,缓存等内存密集型场景,因此,多为企业级用户选择。目前2核16G配置按量收费最低收费标准为0.54元/小时,按月租用标准收费标准为260.44元/1个月。4核32G配置的阿里云服务器按量收费标准最低为1.08元/小时,按月租用标准收费标准为520.88元/1个月。8核64G配置的阿里云服务器按量收费标准最低为2.17元/小时,按月租用标准收费标准为1041.77元/1个月。本文介绍这些配置的最新租用收费标准与活动价格情况,以供参考。
|
4天前
|
监控 PHP Apache
优化 PHP-FPM 参数配置:实现服务器性能提升
优化PHP-FPM的参数配置可以显著提高服务器的性能和稳定性。通过合理设置 `pm.max_children`、`pm.start_servers`、`pm.min_spare_servers`、`pm.max_spare_servers`和 `pm.max_requests`等参数,并结合监控和调优措施,可以有效应对高并发和负载波动,确保Web应用程序的高效运行。希望本文提供的优化建议和配置示例能够帮助您实现服务器性能的提升。
18 3
|
7天前
|
弹性计算 运维
新 企业级ECS集群运维管理训练营 打卡学习领好礼
新 企业级ECS集群运维管理训练营 打卡学习领好礼
29 3
|
6天前
|
存储 缓存 固态存储
阿里云服务器2核8G、4核16G、8核32G配置租用收费标准与活动价格参考
2核8G、8核32G、4核16G配置的云服务器处理器与内存比为1:4,这种配比的云服务器一般适用于中小型数据库系统、缓存、搜索集群和企业办公类应用等通用型场景,因此,多为企业级用户选择。本文介绍这些配置的最新租用收费标准与活动价格情况,以供参考。
|
4天前
|
机器学习/深度学习 人工智能 弹性计算
什么是阿里云GPU云服务器?GPU服务器优势、使用和租赁费用整理
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等多种场景。作为亚太领先的云服务提供商,阿里云的GPU云服务器具备灵活的资源配置、高安全性和易用性,支持多种计费模式,帮助企业高效应对计算密集型任务。
|
3天前
|
机器学习/深度学习 人工智能 弹性计算
阿里云GPU服务器全解析_GPU价格收费标准_GPU优势和使用说明
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等场景。作为亚太领先的云服务商,阿里云GPU云服务器具备高灵活性、易用性、容灾备份、安全性和成本效益,支持多种实例规格,满足不同业务需求。
|
11天前
|
弹性计算
阿里云2核16G服务器多少钱一年?亲测价格查询1个月和1小时收费标准
阿里云2核16G服务器提供多种ECS实例规格,内存型r8i实例1年6折优惠价为1901元,按月收费334.19元,按小时收费0.696221元。更多规格及详细报价请访问阿里云ECS页面。
45 9
|
8天前
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
|
11天前
|
弹性计算 异构计算
2024年阿里云GPU服务器多少钱1小时?亲测价格查询方法
2024年阿里云GPU服务器每小时收费因实例规格不同而异。可通过阿里云GPU服务器页面选择“按量付费”查看具体价格。例如,NVIDIA A100的gn7e实例为34.742元/小时,NVIDIA A10的gn7i实例为12.710156元/小时。更多详情请访问阿里云官网。
49 2
|
17天前
|
存储 弹性计算 NoSQL
"从入门到实践,全方位解析云服务器ECS的秘密——手把手教你轻松驾驭阿里云的强大计算力!"
【10月更文挑战第23天】云服务器ECS(Elastic Compute Service)是阿里云提供的基础云计算服务,允许用户在云端租用和管理虚拟服务器。ECS具有弹性伸缩、按需付费、简单易用等特点,适用于网站托管、数据库部署、大数据分析等多种场景。本文介绍ECS的基本概念、使用场景及快速上手指南。
56 3