【Nginx38】Nginx学习:SSL模块(二)错误状态码、变量及宝塔配置分析

news2025/1/21 15:31:26

Nginx学习:SSL模块(二)错误状态码、变量及宝塔配置分析

继续我们的 SSL 模块的学习。上回其实我们已经搭建起了一个 HTTPS 服务器了,只用了三个配置,其中一个是 listen 的参数,另外两个是指定密钥文件的地址,一个是 crt 文件,一个是 key 文件。今天我们将学习到的是 SSL 中的错误状态码、变量相关的内容,以及最后会看一下在宝塔中配置 SSL 之后,它生成的配置指令是什么样的。

今天的内容不多,但最后的宝塔配置分析还是值得一看的。毕竟要解决的就是大家知其然,也要知其所以然的问题。而先前的我,正是不知其所以然。因此,很多时候,用工具可以配,但是配了之后不敢动,生怕出现什么问题。因为配出来的内容完全不懂是在干嘛呀。咱们今天,主力先解决这个问题。

错误状态码

首先就是错误状态码,在 Nginx 的 SSL 模块中,支持几个非标准错误代码,可用于使用 error_page 指令进行重定向:

  • 495 客户端证书验证过程中发生错误。

  • 496 客户未出示所需的证书。

  • 497 已向 HTTPS 端口发送常规请求。

重定向发生在请求被完全解析并且变量(例如 $request_uri$uri$args 等)可用之后。这三个状态码大家了解一下,如果遇到了返回这三个状态码信息的时候,千万别慌,赶紧看看 SSL 的配置是否有问题。

SSL 相关变量

SSL 模块中提供的变量非常多,可以说是仅次于 HTTP 核心模块提供的变量数量了。这些变量内容也是大家了解一下即可。

  • $ssl_alpn_protocol 返回 ALPN 在 SSL 握手期间选择的协议,否则返回空字符串 (1.21.4)。

  • $ssl_cipher 返回用于已建立 SSL 连接的加密算法的名称。

  • $ssl_ciphers 返回客户端 (1.11.7) 支持的加密算法列表。已知密码按名称列出,未知密码以十六进制显示。只有在使用 OpenSSL 1.0.2 或更高版本时才完全支持该变量。对于旧版本,该变量仅可用于新会话并且仅列出已知密码。

  • $ssl_client_escaped_cert 为已建立的 SSL 连接 (1.13.5) 返回 PEM 格式(urlencoded)的客户端证书。

  • $ssl_client_cert 为已建立的 SSL 连接返回 PEM 格式的客户端证书,除第一行之外的每一行都以制表符开头;这旨在用于 proxy_set_header 指令。该变量已弃用,应改为使用 $ssl_client_escaped_cert 变量。

  • $ssl_client_fingerprint 返回已建立 SSL 连接 (1.7.1) 的客户端证书的 SHA1 指纹。

  • $ssl_client_i_dn 根据 RFC 2253 (1.11.6) 返回已建立 SSL 连接的客户端证书的“颁发者 DN”字符串。

  • $ssl_client_i_dn_legacy 返回已建立 SSL 连接的客户端证书的“颁发者 DN”字符串,在 1.11.6 版本之前,变量名称是 $ssl_client_i_dn

  • $ssl_client_raw_cert 为已建立的 SSL 连接返回 PEM 格式的客户端证书。

  • $ssl_client_s_dn 根据 RFC 2253 (1.11.6) 返回已建立 SSL 连接的客户端证书的“主题 DN”字符串。

  • $ssl_client_s_dn_legacy 返回已建立 SSL 连接的客户端证书的“主题 DN”字符串,在 1.11.6 版本之前,变量名称是 $ssl_client_s_dn

  • $ssl_client_serial 返回已建立 SSL 连接的客户端证书的序列号。

  • $ssl_client_v_end 返回客户端证书的结束日期(1.11.7)。

  • $ssl_client_v_remain 返回客户端证书到期前的天数(1.11.7)。

  • $ssl_client_v_start 返回客户端证书的开始日期(1.11.7)。

  • $ssl_client_verify 如果证书不存在,则返回客户端证书验证的结果:“SUCCESS”、“FAILED:reason”和“NONE”,在 1.11.7 版本之前,“FAILED”结果不包含原因字符串。

  • $ssl_curve 返回用于 SSL 握手密钥交换过程 (1.21.5) 的协商曲线。已知曲线按名称列出,未知曲线以十六进制显示。仅当使用 OpenSSL 3.0 或更高版本时才支持该变量。对于旧版本,变量值将是一个空字符串。

  • $ssl_curves 回客户端 (1.11.7) 支持的曲线列表。已知曲线按名称列出,未知曲线以十六进制显示。仅当使用 OpenSSL 1.0.2 或更高版本时才支持该变量。对于旧版本,变量值将是一个空字符串。该变量仅适用于新会话。

  • $ssl_early_data 如果使用 TLS 1.3 早期数据并且握手未完成,则返回“1”,否则返回“”(1.15.3)。

  • $ssl_protocol 返回已建立的 SSL 连接的协议。

  • $ssl_server_name 返回通过 SNI (1.7.0) 请求的服务器名称。

  • $ssl_session_id 返回已建立 SSL 连接的会话标识符。

  • $ssl_session_reused 如果 SSL 会话被重用,则返回“r”,或否则返回“.”(1.5.11)。

我们可以通过记录记录访问日志来查看这些变量的设置情况,比如像下面这样配置。

log_format ssl 'ssl_alpn_protocol=$ssl_alpn_protocol ssl_cipher=$ssl_cipher ssl_ciphers=$ssl_ciphers'
                'ssl_client_escaped_cert=$ssl_client_escaped_cert ssl_client_cert=$ssl_client_cert ssl_client_fingerprint=$ssl_client_fingerprint'
                'ssl_client_i_dn=$ssl_client_i_dn ssl_client_i_dn_legacy=$ssl_client_i_dn_legacy ssl_client_raw_cert=$ssl_client_raw_cert'
                'ssl_client_s_dn=$ssl_client_s_dn ssl_client_s_dn_legacy=$ssl_client_s_dn_legacy ssl_client_serial=$ssl_client_serial'
                'ssl_client_v_end=$ssl_client_v_end ssl_client_v_remain=$ssl_client_v_remain ssl_client_v_start=$ssl_client_v_start'
                'ssl_client_verify=$ssl_client_verify ssl_curve=$ssl_curve ssl_curves=$ssl_curves'
                'ssl_early_data=$ssl_early_data ssl_protocol=$ssl_protocol ssl_server_name=$ssl_server_name'
                'ssl_session_id=$ssl_session_id ssl_session_reused=$ssl_session_reused';

server{
  ………………
  access_log logs/37.log ssl;
}

配置成功后,访问 https 页面,日志中就会记录下面这些内容。

ssl_alpn_protocol=- ssl_cipher=ECDHE-RSA-AES128-GCM-SHA256 ssl_ciphers=TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:DES-CBC3-SHAssl_client_escaped_cert=- ssl_client_cert=- ssl_client_fingerprint=-ssl_client_i_dn=- ssl_client_i_dn_legacy=- ssl_client_raw_cert=-ssl_client_s_dn=- ssl_client_s_dn_legacy=- ssl_client_serial=-ssl_client_v_end=- ssl_client_v_remain=- ssl_client_v_start=-ssl_client_verify=NONE ssl_curve=- ssl_curves=X25519:prime256v1:secp384r1ssl_early_data=- ssl_protocol=TLSv1.2 ssl_server_name=-ssl_session_id=- ssl_session_reused=.

好吧,不得不说,这一堆变量也是看得我一脸懵逼。除了 ssl_protocol 是协议版本,ssl_cipher 是加密算法之外 ,其它的很多都不知道是干嘛的。但是呢,就像之前在学习 PHP 加解密相关的文章时也说过。本身加解密就是一块非常大的而且非常深的内容,如果只是为了日常应用,那么了解到这个程度也就够了。大家如果一点都不了解的话,可以去我的 PHP 文章学习一下哦。

PHP加解密 http://www.zyblog.com.cn/t/加解密

宝塔 SSL 配置

最后,我们就来看看宝塔面板配置出来的 SSL 配置是啥样的。在宝塔中,大家可以使用免费的 Let's Encrypt 证书。这个证书是免费的,但是要经常续签。一般云服务上的免费证书都是一年,收费则是可选年份的,而这个基本是 40 来天。它的续签宝塔也会自动在定时任务中加上。因此,这个就相当于是彻底免费的一套证书。不过,和很多免费证书一样,它做不了泛域名,也就是 *.zyblog.com.cn 这样对整个域名的证书。只能每个子域名选择性地签发。

在配置好 Let's Encrypt 并自动签发成功后,SSL 页面就会显示成这样。

0e4919b793c36742cb6e681aefc3d60f.png

如果你是自己通过阿里云、腾讯云或者其它任何机构购买的证书,那么也需要将拿到的证书中的内容复制过来,左边是 .key 文件的内容,右边是 .pem 文件的内容。直接复制粘贴进来就可以用了。自己购买的证书要保管好哦。

接下来看看配置文件中生成的 SSL 部分内容。

#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#HTTP_TO_HTTPS_START
if ($server_port !~ 443){
 rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END
ssl_certificate    /www/server/panel/vhost/cert/roadmap.zyblog.com.cn/fullchain.pem;
ssl_certificate_key    /www/server/panel/vhost/cert/roadmap.zyblog.com.cn/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497  https://$host$request_uri;

#SSL-END

不能删除或修改带注释的 404 规则这个,我也不明白是啥意思,有懂得小伙伴可以留言哦。

HTTP_TO_HTTPS_START 注释部分的判断,其实就是上图中,我开启了 强制HTTPS 才会生成的内容。也就是如果我们访问当前 server 时,使用的不是 443 端口,就强制跳到 443 端口。这样就能保证访问的一直是 HTTPS 页面。这个配置也是比较常用的。

ssl_certificate 和 ssl_certificate_key 不多解释了。

ssl_protocols 在上篇文章中不知道大家注意过没,它的默认值是 TLSv1 TLSv1.1 TLSv1.2 ,这里的配置去掉了 TLSv1 ,加上了 TLSv1.3 。很明显,这是抛弃了老版本,加上了新版本嘛。

ssl_ciphers 指定可用的加密算法,这个配置和上面的 $ssl_cipher 以及 $ssl_ciphers 也有关系。主要就是在建立 TLS 连接时,具体要使用的加密算法范围。主要其实是要和客户端浏览器做兼容,不过这里添加的算法并不多。因此需要开启下面那个配置项。更多的我也不清楚了,有了解的小伙伴一定要在评论区不吝赐教哦。

开启 ssl_prefer_server_ciphers ,让服务器加密算法为主要算法来进行加密。

设置 ssl_session_cache ,指定所有工作进程之间共享的缓存空间名称为 SSL ,有 10m 大小。使用 SSL Session 可以减少 TLS 的反复验证,1M 的缓存可以缓存 4000 个连接,因此,10M 可以达到 40000 个连接。对于一般网站来说,完全够用了。是非常有用的性能提升手段,推荐配置。

设置 ssl_session_timeout 指定客户端可以重用会话参数的时间,也就是上面那个缓存的过期时间,这里设置的是 10 分钟。

添加 Strict-Transport-Security 响应头,用于告诉浏览器,这个网站应该只使用 HTTPS 而不是使用 HTTP 进行访问。设置的内容是一个以秒为单位的时间戳,表示的是过期的时候,31536000 表示的时间是一年(31536000/60/60/24=365)。过了这个时间之后,浏览器就会认为这个地址又可以使用 HTTP 访问了。前提是,如果这一年它没再打开过这个网站,否则咱们的响应每次都会返回这个时间嘛,日期也会一直向后拖。对于经常访问的站点来说,这个过期时间就相当于是永久了。

最后,有个 error_page 配置,当错误状态码为 497 ,使用 HTTP 访问 HTTPS 页面时,会报出这个状态码错误。然后 errpr_page 直接指向 https 协议的当前访问页面。其实这也是一种强制 HTTPS 访问的效果。

总结

好了,今天的内容不多吧?而且我们在整个 SSL 模块中也没有做过多的测试,就是最开始配置的那个最简单的 SSL 服务。说实话,这一块的很多配置我真的没用过,也完全不知道是啥意思。甚至在今天的学习之前,我也并不清楚 ssl_ciphers、ssl_session_cache 到底是干嘛用的。真的只知道 ssl 、ssl_certificate、ssl_certificate_key 这三个配置。

好吧,话说回来,大部分情况下,其实有这些就已经足够了。还是那句话,当你在需要的时候,能够隐约想起之前好像在哪儿看过,这玩意 Nginx 有现成的配置就行了。然后再去查文档、查资料进行深入的了解,这才是我们软件开发(踩坑)的正确姿势嘛!

参考文档:http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_conf_command

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

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

相关文章

【LeetCode刷题-排序】--912.排序数组

912.排序数组 方法&#xff1a;使用插入排序 class Solution {public int[] sortArray(int[] nums) {int len nums.length;//循环不变量:使nums[i]插入区间[0,i),使之成为有序数组for(int i 1;i<len;i){//先缓存这个元素&#xff0c;然后之前的元素逐个后移&#xff0c;…

LeetCode----52. N 皇后 II

 题目 n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。 示例 1: 输入:n = 4 输出:2 解释:如上图所示,4 皇后问题存在两个不同的解法。 示例 2: 输入:n = …

【CSDN 每日一练 ★★☆】【数学】旋转图像

【CSDN 每日一练 ★★☆】【数学】旋转图像 数学 数组 题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 示例 1&a…

前端埋点方式

前言&#xff1a; 想要了解用户在系统中所做的操作&#xff0c;从而得出用户在本系统中最常用的模块、在系统中停留的时间。对于了解用户的行为、分析用户的需求有很大的帮助&#xff0c;想实现这种需求可以通过前端埋点的方式。 埋点方式&#xff1a; 1.什么是埋点&#xff1f…

【Selenium+python】自动化测试登录界面

前言&#xff1a;已经学习selenium许久了&#xff0c;奈何公司的项目还在码代码中...&#xff0c;感觉自己学的东西快忘的差不多了&#xff0c;所以就找个网站练练手&#xff0c;顺便回顾一下UI自动化的知识&#xff0c;也希望跟我一样的小白有所受益。 一、用例分析&#xff…

线扫相机DALSA--常见问题四:修改相机参数,参数保存无效情况

该问题是操作不当&#xff0c;未按照正常步骤保存参数所致&#xff0c;相机为RAM机制&#xff0c;参数需保存在采集卡的ROM内。 保存参数步骤&#xff1a; ①首先将相机参数保存至User Set1&#xff1b; ②然后回到Board(采集卡)参数设置区&#xff0c;鼠标选中Basic Timing&a…

C++——类和对象(中)完结

赋值运算符重载 运算符重载 C 为了增强代码的可读性引入了运算符重载 &#xff0c; 运算符重载是具有特殊函数名的函数 &#xff0c;也具有其 返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型与参数列表与普通的函数类似。 函数名字为&#xff1a;关键…

中富转债,章鼓转债上市价格预测

中富转债-123226 基本信息 转债名称&#xff1a;中富转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;5.2亿元。 正股名称&#xff1a;中富电路&#xff0c;今日收盘价&#xff1a;30.03元&#xff0c;转股价格&#xff1a;36.44元。 当前转股价值 转债面…

桥接模式birdge

简介 桥接模式&#xff1a;将抽象与实现相分离&#xff0c;使他们可以独立变化。 角色 抽象化&#xff08;Abstraction&#xff09;角色&#xff1a; 该类持有一个对实现角色的引用&#xff0c;抽象角色中的方法需要实现角色来实现&#xff0c;抽象角色一般为抽象类&#xf…

NOA标配搭载率不足3%!英伟达中国「自研」智驾方案

汽车行业的特殊性&#xff0c;意味着&#xff0c;对于供应链来说&#xff0c;一家独大几乎不可能。对于芯片赛道来说&#xff0c;同样如此。 以智能驾驶为例&#xff0c;目前的供应链形态&#xff0c;也正处于变革的关键周期。各路玩家也都在尝试与车企合作模式的多元化。 高工…

并发请求控制

Chrome 浏览器最多并发6个请求。一般情况下&#xff0c;我们都会设置并发数为 3。 并发请求控制主要有两种区别&#xff1a;假设并发数为 3 三个请求为一组进行并发&#xff0c;这三个请求全部完成了&#xff0c;再进行下一组。在第一种方式的基础上加上滑动补位&#xff0c;…

Express框架开发接口之前台分类导航

1.初始化 const handleDB require(../handleDB/index) // 获取全部导航 exports.allNav (req, res) > {(async function () {})() } // 更新或者添加导航 exports.upNav (req, res) > {(async function () {})() } // 根据id删除 exports.delNav (req, res) > {(a…

Mac电脑风扇控制推荐 Macs Fan Control Pro 中文 for mac

Macs Fan Control Pro是一款功能全面、易于使用且具有良好兼容性和安全性的风扇控制软件&#xff0c;适用于各种Mac用户。 除了能够调整风扇速度外&#xff0c;Macs Fan Control Pro还支持实时监测硬件传感器的温度&#xff0c;例如CPU、硬盘等&#xff0c;同时显示每个传感器…

SpringBoot系列之自定义Jackson对象映射器格式日期数据

开发环境 JDK 1.8SpringBoot2.2.1Maven 3.2Mysql5.7.36开发工具 IntelliJ IDEAsmartGit 背景 在我之前的博客中&#xff0c;有对Springboot2.0集成Mybatis Plus做了比较详细的描述&#xff0c;现在这篇博客介绍&#xff0c;基于开源的jackson api来自定义ObjectMapping&…

MPLAB X IDE 仿真打断点提示已中断的断点?

这种中间带裂缝的是无效断点。 原因可能与XC编译器的优化有关&#xff0c;最后生成的汇编与C语言并不是一一对应的(官方给的解释是效率高)。所以这一行C语言转换的汇编代码可能并不在这个位置&#xff0c;也可能与其它汇编合并后根本就没有 我的解决方法是把优化等级调到最低&a…

【多线程面试题二十二】、 说说你对读写锁的了解

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说说你对读写锁的了解 …

windows server 2016调优

1. 增加TCP连接的最大数量&#xff1a; 在您当前的注册表路径&#xff08;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters&#xff09;中的右侧窗格&#xff0c;右击空白处&#xff0c;选择“新建” -> “DWORD (32位) 值”。为新的值命名为TcpNu…

Python:PDF转长图像和分页图像

简介&#xff1a;随着电子化文档的普及&#xff0c;PDF文件的使用频率越来越高。有时我们需要将PDF中的内容转化为图片格式进行分享或编辑&#xff0c;那么如何才能轻松地完成此任务呢&#xff1f;本文将为你展示一个Python工具&#xff1a;如何将PDF文件转化为图片&#xff0c…

Macroscope安全漏洞检测工具简介

学习目标&#xff1a; 本介绍旨在帮助感兴趣者尽快了解 Macroscope&#xff0c;这是一款用于安全测试自动化和漏洞管理的企业工具。 全覆盖应用程序安全测试&#xff1a; 如下图所示&#xff0c;如果使用多种互补工具&#xff08;SAST/DAST/SCA 等&#xff09;来检测应用程序…

redis的两种持久化的方式 RDB AOF

1. RDB持久化 就是将某个时间点的数据快照&#xff0c;全部保存在磁盘的二进制文件中。 可以选择命令手动触发&#xff1a; save命令&#xff0c;阻塞式保存快照数据&#xff0c;会阻塞其它操作 bgsave&#xff0c;开启子线程执行RDB 或者配置文件配置自动触发&#xff1a; 在r…