Nginx学习笔记(十)如何配置HTTPS协议?(公网)

目录

    • 一、简介
    • 二、SSL 证书类型介绍
    • 三、公网 SSL 证书
      • 3.1 证书管理工具
      • 3.2 下载安装 acme.sh
      • 3.3 申请并下载证书
        • 报错1:没有指定账号
        • 报错2:DNS无法解析的域名
        • 报错3:无效的响应 404
      • 3.4 配置 Nginx
      • 3.5 证书过期刷新
    • 四、补充
      • 4.1 同一域名的不同端口,可以共用一个SSL证书吗?
      • 4.2 Nginx 转发 403 问题

一、简介

HTTPS 是通过 SSL 证书 加密传输 的 HTTP 协议。可以通过 Nginx、Apache 等中间件进行接收和转发,这里我们主要介绍 Nginx 中间件的配置方式。

通过 Nginx 配置 HTTPS 协议,分为两步:

  1. 服务器需要先下载好 SSL 证书;
  2. 在 Nginx 配置好 SSL 证书的相关信息即可。

在了解清楚这些内容之后,我们就可以开始实战操作了。


二、SSL 证书类型介绍

HTTPS 协议的 SSL 证书根据 验证级别 可以分为三种:

  1. DV(Domain Validation) 证书:这种证书仅需验证申请者的域名所有权,无需对网站的实际运行者或组织进行身份验证。它是 最基本 的整数类型,适用于个人、小型企业
  2. OV(Organization Validation) 证书:这种证书在 DV 证书的基础上 增加了对申请者组织身份的验证。它 需要验证申请者的公司存在并且有效地拥有该域名适用于中型企业
  3. EV(Extended Validation) 证书:这种证书提供 最高级别 的验证,包括 对申请者的身份、组织和域名的全面审核。EV证书通常用于需要高安全性和信任度的网站,如银行和金融机构,适用于高要求企业

除此之外,SSL 证书还可以分为 公网内网 两种:

  • 公网证书: 要求必须公网可访问,并且需要通过例如在服务器创建一个指定文件,在公网的对应路径下要能正常访问。
  • 内网证书: 不需要进行验证,可以直接使用。

本片文章我们主要介绍公网环境的 SSL 证书。

补充: HTTPS 的 SSL 证书 不仅仅只支持域名,还可以支持 IP 形式的 HTTPS 协议哟。


三、公网 SSL 证书

3.1 证书管理工具

上面介绍了证书的各种类型,本文我们主要展示如何下载并配置免费的 Let’s Encrypt 网站颁发的 DV证书,网站地址如下:(证书有效期仅有三个月)

  • Let’s Encrypt: https://letsencrypt.org/zh-cn/

这里我们只是展示一下官网的地址,实际的证书下载操作并不能直接去官网操作。我们可以选择多种 客户端工具 来与 Let’s Encrypt 进行交互,常见的有以下三种:

  • acme-tiny:是一个由 Python 编写的证书申请脚本。

    开源地址:https://gitcode.com/diafygi/acme-tiny/overview

  • acme.sh:是一个由 Shell 编写的证书申请脚本。

    开源地址:https://github.com/acmesh-official/acme.sh

  • Certbot:是一款比较齐全的证书管理工具。

    官方地址:https://certbot.eff.org/

这里我们主要使用 acme.sh 来进行证书管理,因为它比较轻量级,而且操作简单。

补充: 可能有小伙伴发现了,为什么前两个工具都命名为 acme,什么是 acme

  • ACME协议 是由 Let’s Encrypt 组织开发的一种 通信协议,主要 用于服务器和证书颁发机构(CA)之间的交互。它的主要目标是 简化SSL/TLS证书的申请、验证和管理流程。通过ACME协议,开发者可以构建自动化的证书管理工具,使得普通用户也能轻松获取并更新安全的数字证书。

3.2 下载安装 acme.sh

先来到家目录下:

cd ~

执行如下命令,下载并安装 acme.sh

curl https://get.acme.sh | sh -s email=my@example.com

如果出现网络问题:

  • 0curl: (6) Could not resolve host: raw.githubusercontent.com
  • 0curl: (7) Failed connect to raw.githubusercontent.com:443; 拒绝连接

可以执行如下命令:

git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m my@test.com

注意: 这里不要再用官方的 my@example.com 了,这个邮箱已经被禁用了,后面会报错的:

在这里插入图片描述

执行结果如下,说明安装成功了:

如果是通过 git clone 的方式安装的,此时可以删除克隆下来的文件了。

cd ~
rm -rf acme.sh

安装之后,会在 ~ 家目录创建一个 .acme.sh 文件夹,如下所示:

.acme.sh 文件夹中的内容如下:

3.3 申请并下载证书

执行如下命令,通过提交 域名webroot 来申请并下载证书:

sh /root/.acme.sh/acme.sh --issue -d 23jw3585ev35.vicp.fun  --webroot  /data/webroot --server letsencrypt
  • 23jw3585ev35.vicp.fun:由于没有域名,这是我通过 花生壳 工具用 内网穿透 做的临时域名,仅用于测试,实际环境中可以使用自己的域名。
  • --server letsencrypt:告诉 acme.sh 客户端将所有的证书请求都发送到 Let’s Encrypt 的服务器进行处理。
  • 如果需要配置多个域名共用一个证书,可以添加多个 -d 域名 的配置。

这里可能会出现各种报错,在了解这些报错之前,我们需要先了解一下 DV 证书申请包含了哪些过程,因为 我们的报错点都是可以在这些过程中找到出处 的:

  • 过程1,验证当前账号信息: 判断当前账号是否存在,不存在则自动注册。
  • 过程2,验证域名是否可以被DNS正常解析: 如果无法正常解析,则报错。
  • 过程3,验证域名下新生成的文件是否可以正常访问: acme.sh 会在 webroot 路径下随机生成一个文件,然后尝试通过域名访问,并核验文件内容,从而确认域名是否为当前服务器所有。

以上三点 全部验证通过 之后,才可以正常颁发并下载证书。

成功申请并下载证书的结果如下:

在这里插入图片描述

下面列举一下小编在申请证书过程中遇到的几种报错场景:

报错1:没有指定账号

对应过程1:验证当前账号信息。如果之前注册的时候没有指定邮箱,这里执行之后会报错如下:

  • Please update your account with an email address first.

    请先用邮箱注册一个账号。

在这里插入图片描述

我们根据提示执行如下命令,注册一个邮箱地址上去即可

acme.sh --register-account -m my@test.com

执行结果如下:

在这里插入图片描述

再次执行上面的命令即可。

报错2:DNS无法解析的域名

对应过程2:验证域名是否可以被DNS正常解析。如果当前申请证书的域名不存在、没有注册,就会报错:

  • www.domain123.cn:Verify error:DNS problem: NXDOMAIN looking up A for www.domain123.cn - check that a DNS record exists for this domain; DNS problem: NXDOMAIN looking up AAAA for www.domain123.cn - check that a DNS record exists for this domain

    www.domain123.cn域名解析失败,域名的 A记录(用于将域名指向IPv4)和 AAAA记录(用于将域名指向IPv6)没有找到。

在这里插入图片描述

报错3:无效的响应 404

对应过程3:验证域名下新生成的文件是否可以正常访问。如果当前的域名存在,但是脚本新创建的测试文件无法被正常映射出去的话,就会报错:

  • www.myweb.cn:Verify error:170.33.13.246: Invalid response from http://www.myweb.cn/.well-known/acme-challenge/tgvilsyFFlCql3VnyC51rHmGoirf6l9mMPMHiTgmfVI: 404

    www.myweb.cn 验证失败,文件路径不存在:404。

  • 日志中的 Pending, The CA is processing your order, please just wait. (2/30) 就是为了防止网络延迟导致没有访问新生成的文件而 重试

在这里插入图片描述

3.4 配置 Nginx

HTTPS 协议默认使用 443 端口,nginx.conf 中相关的配置内容如下:

http {server {listen       443 ssl; # https默认为443端口,当然也可以用任何端口。后面ssl用于告诉Nginx在指定的端口上启用SSL/TLS加密server_name  example.com; # 你网站的域名(查看说明1)# 下面输入证书和私钥的地址ssl_certificate      certs/my_cert.crt; # 证书(查看说明2)ssl_certificate_key  certs/my_cert.key; # 证书对应的私钥文件(查看说明3)ssl_session_cache    shared:SSL:1m; # 可选配置,设置了 SSL 会话缓存的类型和大小。(具体查看说明5)ssl_session_timeout  5m; # 可选配置,设置了 SSL 会话缓存的超时时间为 5 分钟。ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 可选配置, 指定了 SSL/TLS 握手过程中允许使用的加密算法的优先级顺序。(具体查看说明7)ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; # 可选配置,指定了允许使用的 SSL/TLS 协议版本。(具体查看说明8)ssl_prefer_server_ciphers  on; # 可选配置(具体查看说明9)# 指定 webroot 路径location / {root /data/webroot/;access_log   /data/httplogs/root/access.log main;error_log    /data/weblogs/root/error.log;}}
}

配置说明:

  1. server_name域名配置,需要和申请SSL证书的域名保持一致。
  2. ssl_certificate证书文件,包含:服务器的公钥、服务器信息、证书办法机构(CA)的数字签名。可以是 .pem 格式,也可以是 .cer.crt 格式的文件。(.cer和.crt格式除了名称没有区别)
  3. ssl_certificate_key私钥文件,包含证书文件中公钥相对应的私钥,用于对数据进行解密和签名操作,必须严格保密。可以是 .pem 格式,也可以是 .key 格式的文件。
  4. .pem 格式和 .crt/.cer 格式有什么区别?
    • SSL 证书的 PEM 和 CRT/CER 格式都是用于存放证书文件的公钥,有一些区别,但是 大多数情况下可以互换使用
  5. ssl_session_cache:设置了 SSL 会话缓存的类型和大小。启用 SSL 会话缓存可以提高性能,因为它允许客户端在后续连接中重用之前协商的会话参数,避免了重复进行完整的 SSL/TLS 握手过程。
    • shared:表示在所有工作进程之间共享缓存。
    • SSL:是缓存的名称。
    • 1m:表示缓存的最大限制为1M。
  6. ssl_session_timeout:设置 SSL 会话缓存的超时时间,5m 表示5分钟后过期。
  7. ssl_ciphers:设置 SSL/TLS 握手过程中允许使用的加密算法的优先级顺序,优先级从高到低排列。
    • 建议禁用一些不安全的算法(如 NULL、aNULL、MD5、ADH、RC4等)。
  8. ssl_protocols:设置允许使用的 SSL/TLS 协议版本。
    • 建议只启用安全的版本协议,如 TLSv1.1、TLSv1.2、TLSv1.3。
    • 禁用不安全的版本协议,如:SSL v2、SSL v3。
  9. ssl_prefer_server_ciphers:设置 SSL/TLS 握手过程中,优先使用服务器端指定的加密算法,而不是客户端提供的加密算法。这样可以确保使用更安全的加密算法。

3.5 证书过期刷新

我们只需要重新执行申请证书的命令,就可以查看证书的过期时间:

sh /root/.acme.sh/acme.sh --issue -d 23jw3585ev35.vicp.fun  --webroot  /data/webroot --server letsencrypt
  • 23jw3585ev35.vicp.fun:由于没有域名,这是我通过 花生壳 工具用 内网穿透 做的临时域名,仅用于测试,实际环境中可以使用自己的域名。
  • --server letsencrypt:告诉 acme.sh 客户端将所有的证书请求都发送到 Let’s Encrypt 的服务器进行处理。

再次执行即可看到证书过期时间:

在这里插入图片描述

可以通过增加 --force 强制刷新刷新证书:

sh /root/.acme.sh/acme.sh --issue -d 23jw3585ev35.vicp.fun  --webroot  /data/webroot --server letsencrypt

执行结果如下所示:

在这里插入图片描述


四、补充

4.1 同一域名的不同端口,可以共用一个SSL证书吗?

  • 可以的。 SSL 证书是基于域名颁发的,而不是基于端口号。具体配置方式如下所示:
server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/certificate.crt;ssl_certificate_key /path/to/private.key;...
}server {listen 8443 ssl;server_name example.com;ssl_certificate /path/to/certificate.crt;ssl_certificate_key /path/to/private.key;...
}

4.2 Nginx 转发 403 问题

403 Forbidden 如果没有自己特殊指定的话,指的是 访问的资源没有权限,nginx中指定的 location 转发后的地址要确保 当前执行 Nginx 命令的 用户有权限访问webroot文件夹才行

整理完毕,完结撒花~🌻





参考地址:

1.nginx配置ssl支持https的详细步骤,https://blog.csdn.net/weixin_45501219/article/details/136825372

2.免费的SSL证书(Let‘s Encrypt / acme),https://blog.csdn.net/weixin_45602663/article/details/126631496

3.DNS解析中的A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发等,https://blog.csdn.net/weixin_44388689/article/details/132466543

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

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

相关文章

硬盘危机:磁盘损坏无法打开的应对策略

在数字化时代,磁盘作为数据存储和传输的核心设备,其稳定性和安全性至关重要。然而,在日常使用过程中,我们时常会面临磁盘损坏无法打开的困境。这不仅会影响我们的工作效率,还可能造成重要数据的丢失。本文将深入探讨磁…

2024年,计算机相关专业还值得选择吗?

问:随着2024年高考落幕,数百万高三学生又将面临人生中的重要抉择:选择大学专业。在这个关键节点,计算机相关专业是否仍是“万金油”的选择?在过去很长一段时间里,计算机科学与技术、人工智能、网络安全、软…

抖音 根据sec uid获取个人详细信息(性别、年龄、属地、关注数、粉丝数、简介等)

本文带来用户的secuid获取用户信息以及其他基本信息: 话不多说看效果: 第一步输入用户sec_uid 根据secuid获取到用户基本信息: 可以支持接口批量转换,欢迎咨询

从信息泄露到登录后台

信息收集 上谷歌用谷歌语法,经过漫长的翻找发现一处PDF: 是某大学的某系统帮助文档,其中泄露了人员的工号和sfz 尝试登陆 此时,虽然获取了工号和sfz,众所周知,现在很多统一身份认证都是学号/工号sfz后六位…

玩转ChatGPT:最全学术论文提示词分享【下】

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 本篇文章,是系列文章「最全学术论文提示词」的完结篇。前两篇的内容请到文末链接处跳转👇🏻 11.提交和发布 prompt 1:根据[期刊/会议]指…

深入探讨Java压缩利器:net.lingala.zip4j.ZipFile的应用与实践

在现代软件开发中,数据压缩是一个常见且重要的任务。无论是减小文件大小以节省存储空间,还是将多个文件打包在一起以便于传输和分发,压缩技术都是不可或缺的。在Java世界中,net.lingala.zip4j.ZipFile库因其强大的功能和易用性&am…

如何系统学习vue框架

前言 在软件开发的浩渺星海中,编程规范如同航海的罗盘,为我们指引方向,确保我们的代码之旅能够顺利、高效地到达目的地。无论是个人开发者还是大型团队,编程规范都是提升代码质量、保障项目成功不可或缺的一环。 因此&#xff0c…

人工智能模型对有争议的话题持相反的观点

人工智能模型对有争议的话题持相反的观点 并非所有生成式人工智能模型都是平等的,特别是当涉及到它们如何处理两极分化的主题时。 在2024年ACM公平、问责和透明度(FAccT)会议上发表的一项最新研究中,卡内基梅隆大学、阿姆斯特丹大学和人工智能初创公司h…

【设计模式】结构型-代理模式

在静谧的林间舞台上,代理轻舞着对象的梦想,掌控访问,引领旋律,真实与虚幻间,交织出灵动的诗篇。 文章目录 一、数据库操作的问题二、代理模式三、代理模式的核心组成四、运用代理模式五、代理模式的应用场景六、小结推…

nginx脚本原理(复杂变量)详解

本文将结合实际的源码来探讨nginx的脚本实现原理,并会在最后对此进行总结。本次只展示复杂变量,对于其if等指令后续文章再来探讨。 nginx的脚本支持使其具备了强大的灵活性,我们可以使用简单的脚本指令配置,进行灵活的功能定制。欲了解此功能,必先了解其变量的实现原理.(…

Web前端可以开发哪些:探索无尽的可能性

Web前端可以开发哪些:探索无尽的可能性 在数字化时代的浪潮中,Web前端技术以其独特的魅力和广泛的应用领域,吸引了越来越多的开发者投入其中。那么,Web前端究竟可以开发哪些内容呢?本文将从四个方面、五个方面、六个方…

网工请自查,这十个技术问题还不会就out了

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 下午好,我的网工朋友。 今天我想和大家聊聊几个与我们日常工作紧密相关的技术问题,它们都多多少少地影响了咱们的工作效率…

服务器如何有效解决源IP暴露问题

在现代互联网环境中,服务器的安全性至关重要。源IP暴露不仅增加了服务器遭受DDoS攻击、恶意扫描和数据泄露的风险,还可能影响业务的正常运行。本文将探讨如何利用技术手段,尤其是CDN和防火墙策略,来有效地解决服务器源IP暴露的问题…

C#面:Server.UrlEncode、HttpUtility.UrlDecode的区别

C#中的Server.UrlEncode和HttpUtility.UrlDecode都是用于处理URL编码和解码的方法,它们的区别如下: Server.UrlEncode: Server.UrlEncode是一个静态方法,属于System.Web命名空间。它用于将字符串进行URL编码,将特殊字…

JS常用HOOK脚本

Hook定义 Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权 这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递 简单来说&am…

数字人贴牌哪家好?需要关注的核心优势有哪些?

随着人工智能时代的发展,数字人蕴含着的广泛的应用场景和庞大的市场需求也逐渐展现在了人们的眼前。在此背景下,数字人成为了一众创业赛道中的大热门,数字人贴牌模式也因此走红。 所谓的数字人贴牌,又称为数字人源码部署和数字人O…

04. fastLED像素参考(颜色设置详解)

fastLED像素参考 原文 Overview 概述 There’s two main pixel types in the library - the CRGB class and the CHSV class. CHSV objects have to be converted to CRGB objects before they can be written out. You can also write CHSV objects into the CRGB array an…

我们离成功有多远呢?只要能完成自己阶段性的目标就算是一次成功

做起一个账号,带好一个团队,经营好一家公司,似乎这些都能叫成功,成功的定义可大可小,而我认为只要能完成自己阶段性的目标就算是一次成功,毕竟每个人学历、背景、阅历、资源、认知都不同,很难同…

重磅!最新JCR分区、中科院分区、影响因子大汇总!

【欧亚科睿学术】 期 刊 影响因子及JCR分区 2023年JCR 2023年6月,科睿唯安(Clarivate Analytics)发布了最新年度期刊引证报告(JCR)。 JCR 变化盘点 ① ESCI和AHCI期刊首次获得影响因子。 据最新数据显示(截止至2023年6月28日),目前共有SCIE期刊95…

豆瓣电影信息爬虫【2024年6月】教程

豆瓣电影信息爬虫【2024年6月】教程,赋完整代码 在本教程中,我们将使用以下技术栈来构建一个爬虫,用于爬取豆瓣电影列表页面的信息: 完整代码放到最后 ; 完整代码放到最后 ; 完整代码放到最后 ;…