踩了大坑:https 证书访问错乱

2023-11-17

一、问题排查及解决

今天遇到这样一个问题,问题的经过是这样的:

同一台服务器里,nginx 部署了多个项目,配置了多个域名,域名的二级域名(例如:baidu.com)都是一致的,三级域名的证书都是在阿里云中申请的SSL免费证书。

在测试时,以https协议头访问,浏览器提示没有证书不安全,查看证书时,居然发现是另一个域名的证书。

比如: 项目A aa.com 和项目B bb.com, 正常来说,https://aa.com 使用的是aa的证书,https://bb.com 使用的是bb的证书。

但是!!! 兄弟们,我居然遇到了下面这个奇葩事

访问 https://aa.com 使用的是bb的证书,就会报错证书不安全,需要再次刷新才会使用本域名的ssl证书,而且这个问题是百分百复现的噢!

经过各种排查,怀疑可能有以下三个原因,并且我给出了对应的解决方式,只希望各位兄弟们不要再苦苦找寻问题的真相

问题一:证书加载错乱

  • 问题原因:

在 nginx/vhost/目录下有 多个配置文件,分别是 aa.com.conf 和 bb.com.conf 和 ab.com.conf

但是接管顺序是按照 配置文件的加载顺序来进行,按照正常的文件名排序,就是 ab.com.conf 优先于 bb.com.conf ,所以就会造成ssl证书访问错乱。

  • 解决方法:

既然在同一台服务器会有证书加载错乱的问题,那么就把域名分开配置,例如将aa.com 放在另一台服务器中即可

问题二:DNS 解析污染问题

  • 问题原因:

DNS解析被污染,首次访问aa.com时,DNS解析指向了bb.com,只有再次刷新才可以进行访问

  • 解决方法:

查找DNS解析源,进行联系解决,这个一般可能就联系不到了,直接看我最下面的解决方式。

问题三:浏览器校验问题

  • 问题原因:

谷歌或火狐浏览器会对EV证书进行校验

  • 解决方法:

使用非EV证书,或者使用其它浏览器,例如微软的edge浏览器

二、终极解决方法

不管上面是什么问题,兄弟们,咱们不用阿里云的免费证书了,可以使用certbot 生成 ssl证书

2.1 可外网访问域名

  • 1.安装certbot及nginx的certbot插件(二进制安装无法使用该方式)
yum install certbot certbot-nginx -y
  • 2.生成证书
certbot --nginx

输入“certbot --nginx” →输入自己申请的邮箱→选择A→选择Y→选择要生成的域名,如果是多个域名的话,用 逗号 进行分割→选择 2,这样就生成了SSL证书了
SSL证书具体位置: /ect/letsencrypt/live 下

  • 3.配置nginx

在上面第二步中,我们直接将nginx配置写入了已存在的配置文件,所以不需要再次配置

  • 4.自动更新

每月一号凌晨三点更新

# crontab -e

0 3 1 * * certbot renew --force-renew

2.2 只能内网访问域名

利用DNS质询方法

  • 1.开始申请证书
    执行如下命令开始申请证书,按照提示操作即可:
certbot certonly --manual --preferred-challenges dns -d example.com
  • 2.添加解析记录
    当命令执行中,会收到类似如下提示,要求添加 TXT 解析记录:
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

667drNmQL3vX6bu8YZlgy0wKNBlCny8yrjF1lSaUndc

Once this is deployed,
Press ENTER to continue

根据上面提示,登录云商后台(比如阿里云、腾讯云 等等),添加名为 _acme-challenge.example.com 的 TXT 记录,并使用 667drNmQL3vX6bu8YZlgy0wKNBlCny8yrjF1lSaUndc 作为记录值。

注意事项:

    1. 由于 DNS 记录不会马上生效,所以稍后再按回车键。
    1. 使用 dig +short -t txt _acme-challenge.example.com 命令验证 DNS 是否生效。
  • 3.配置nginx
    certbot生成的证书在/etc/letsencrypt/live/example.com/目录,配置nginx文件如下

server{
    listen 443 ssl;
    server_name example.com;

    include /etc/nginx/conf.d/example.d/*;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
server{
    if ($host = example.com) {
        return 301 https://$host$request_uri;
    }

    server_name example.com;
    listen 80;
    return 404;
}

2.3 内网自动化配置

  • 1.配置脚本
git clone https://gitee.com/skyyemperor/certbot-letencrypt-wildcardcertificates-alydns-au /usr/local/certbot
cd /usr/local/certbot
chmod u+x ./au.sh

修改云厂商API配置

vim au.sh
# TXY_KEY="AKIDC......."
# TXY_TOKEN="3pLabL...."

2.申请证书

certbot certonly -d 'example.com' \
    --manual --preferred-challenges dns \
    --manual-auth-hook "/usr/local/certbot/au.sh python txy add" \
    --manual-cleanup-hook "/usr/local/certbot/au.sh python txy clean"

2.4 错误解决

Let’s Encrypt 的免费SSL证书一般通过服务器使用Certbot来进行自动注册更新和管理,但是部分服务器系统却无法通过 yum install certbot 命令直接安装Certbot,会提示 No package certbot available.

  • centos6
wget https://dl.eff.org/certbot-auto
sudo mv certbot-auto /usr/local/bin/certbot-auto
sudo chown root /usr/local/bin/certbot-auto
sudo chmod 0755 /usr/local/bin/certbot-auto
  • centos7
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

yum install certbot
  • Ubuntu
apt-get update
apt-get install software-properties-common
add-apt-repository ppa:certbot/certbot
apt-get update

apt-get install certbot
  • Debian
apt-get update
apt-get install software-properties-common
add-apt-repository ppa:certbot/certbot
apt-get update

apt-get install certbot -t jessie-backports

具体详情可参考我的另一篇文档: 为Nginx申请和使用Let‘s Encrypt的SSL免费证书

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

踩了大坑:https 证书访问错乱 的相关文章

  • iframe src 允许所有来源,但仍然收到跨来源错误

    我管理 siteA 的前端 并在页面上有一个 iframe 其中 src 指向 siteB 的资源 这是其他供应商和客户端使用的可嵌入资源 其视频嵌入 因此 siteB 的响应标头设置为 Access Control Allow Origi
  • URL::forceSchema 在登录前不起作用

    我在用着URL forceSchema https 在我的 Laravel 5 3 应用程序上强制使用 SSL 然而 它只有在登录后才有效 即使登录页面没有被 https 覆盖 我在用着可信代理 https github com fidel
  • 使用 --prof 选项创建多个日志文件而不是一个 v8.log 的节点

    我正在尝试使用 prof 选项来分析我的 Node 应用程序 但我发现不是一个单一的 v8 log 文件 而是使用诸如isolate 0x9582b40 v8 log isolate 0xa1cab78 v8 6049 等前缀创建的多个文件
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 由于 abi::cxx11 符号导致的链接问题?

    我们最近收到一份报告 因为GCC 5 1 libstdc 和双 ABI http gcc gnu org onlinedocs libstdc manual using dual abi html 它似乎Clang 不知道 GCC 内联名称
  • 对于较大的请求正文,Nginx proxy_cache_key $request_body 将被忽略

    我使用 nginx 作为反向代理 我希望它能够缓存 POST 请求 我的后端已正确配置为为 POST 请求返回适当的缓存控制标头 在 nginx 中我配置了 proxy cache methods POST proxy cache key
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na
  • Linux下单个目录下文件过多会怎样?

    如果一个目录中有大约 1 000 000 个单独的文件 大部分大小为 100k 其中没有其他目录和文件 是否会以任何其他可能的方式降低效率或产生缺点 ARG MAX 会对此提出异议 例如 rm rf 在目录中时 会说 参数太多 想要执行某种
  • 如何使用 nohup 获取正在运行的程序列表

    我正在通过 SSH 连接访问运行 CentOS linux 发行版 的服务器 由于我无法始终保持登录状态 因此我使用 nohup command 来运行我的程序 我找不到如何获取我开始使用 nohup 的所有程序的列表 工作 只有在我注销之
  • Linux 中有没有一种轻量级的方法来获取当前进程数?

    我希望我的 基于 C C 的 程序显示一个数字指示器 指示本地系统上当前有多少个进程 将经常查询正在运行的进程数值 例如每秒一次 以更新我的显示 有没有一种轻量级的方法来获取该数字 显然我可以调用 ps ax wc l 但我不想强迫计算机生
  • 通过名称获取进程ID

    我想在 Linux 下获得一个给定其名称的进程 ID 有没有一种简单的方法可以做到这一点 我还没有在 C 上找到任何可以轻松使用的东西 如果追求 易于使用 char buf 512 FILE cmd pipe popen pidof s p
  • 点击界面没有出现

    我决定添加一个点击界面并在我的代码中使用它 但我能够得到它的状态 sudo ip f link tuntap add tap10 mode tap sudo ip link set tap10 up 之后当我执行 ip link 时 tap
  • Linux 上的“软/硬 nofile”是什么意思

    当我尝试在RedHat EL5上安装软件时 我得到了错误 软 硬nofile的期望值是4096 而默认值是1024 我设法增加了这个数字 但我不知道参数是什么 他们指的是软链接和硬链接吗 我改变的方法是 a 修改 etc security
  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • X 按键/释放事件捕获,与焦点窗口无关

    我想记录所有传入的按键事件 无论哪个窗口处于焦点状态或指针位于何处 我编写了一个示例代码 它应该捕获当前焦点窗口的按键事件 include
  • 我必须做什么才能使通过 HTTPS 提供的图像等内容缓存在客户端?

    我使用 Tomcat 作为服务器 使用 Internet Explorer 6 作为浏览器 我们应用程序中的网页大约有 75 张图像 我们正在使用 SSL 加载所有内容似乎非常慢 如何配置 Tomcat 以便 IE 缓存图像 如果您通过 h
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul

随机推荐

  • 安装CentOS7.6并创建用户及优化系统

    文章目录 安装系统 创建用户及基础优化系统 安装系统 制作CentOS7 6的镜像光盘或U盘 略过 将光盘或U盘放入到服务器中 修改BIOS启动选项 将其修改为光盘或U盘启动 启动服务器 如果是物理机的话 启动服务器后 进入远控卡 设置远控
  • JAVA socket编程实例

    转载文章 原作者无从考证 感谢作者的无私奉献 事实上网络编程简单的理解就是两台计算机相互通讯数据而已 对于程序员而言 去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了 Java SDK提供一些相对简单的Api来完成这些工作 Soc
  • 【实战练习】汽油辛烷值优化建模(一)(题目+数据集)

    先放上题目和数据集 链接 https pan baidu com s 15 iDC9Wdx49rUe Qt2b Uw 提取码 6666 一 题目 1 背景 汽油是小型车辆的主要燃料 汽油燃烧产生的尾气排放对大气环境有重要影响 为此 世界各国
  • 《Qt快速入门》-- 信号与槽机制

    每一个图形开发语言 工具都有自己的一套的ui交互机制 Qt也不例外 Qt有自己独特的信号与槽机制用于ui与功能算法的交互 Qt的信号与槽机制包含以下三点 1 确定是哪个控件发出了信号 Who 2 确定发出了什么信号 What 3 确定这个信
  • java必懂之"=="与equals的区别

    屁话不多说 直接上代码 equals和关系运算符 的区别 author 刘威辰的秘密花园 1 用在基本数据类型boolean a b 2 判断引用是否指向同一个地址且内容是否相同 equals 1 用于判断两个变量是否对同一个对象的引用 即
  • Django报错403 Forbidden. CSRF token missing or incorrect的解决办法

    Django报错403 Forbidden CSRF token missing or incorrect的解决办法 首先要确认自己在views py中使用的是render 之后确认自己在xx html中的
  • KCF高速跟踪详解

    思想 一般化的跟踪问题可以分解成如下几步 1 在 It 帧中 在当前位置 pt 附近采样 训练一个回归器 这个回归器能计算一个小窗口采样的响应 2 在 It 1 帧中 在前一帧位置 pt 附近采样 用前述回归器判断每个采样的响应 3 响应最
  • IntelliJ IDEA 如何创建一个包,并在包中创建一个Java程序

    1 选中scr右键后 将鼠标放到New上 点击Package 2 采用域名倒置的方式对包名进行命名 3 选中包后 鼠标右键选中New 点击Java Class 完成一个Java程序的创建
  • Python算法:深度优先搜索—DFS(模板及其样例)

    深度优先搜索搜索 介绍 沿着一条路径一直搜索下去 在无法搜索时 回退到刚刚访问过的节点 并且每个节点只能访问一次 本质上是持续搜索 遍历了所有可能的情况 必然能得到解 流程是一个树的形式 每次一条路走到黑 目的主要是达到被搜索结构的叶结点直
  • Nginx学习与实战 · 解决net::ERR_CONTENT_LENGTH_MISMATCH 206问题

    Vue项目引入了d3 js 在打包部署到nginx静态服务后 页面不能正常展示 F12打开控制台 发现报了几个net ERR CONTENT LENGTH MISMATCH 206 Partial Content 错误 第一次遇到Statu
  • Java 实现微信支付详细教程

    摘要 最近的一个项目中涉及到了支付业务 其中用到了微信支付和支付宝支付 在做的过程中也遇到些问题 所以现在总结梳理一下 分享给有需要的人 也为自己以后回顾留个思路 一 微信支付接入准备工作 首先 微信支付 只支持企业用户 个人用户是不能接入
  • 【Pytorch论文相关代码】使用SOLD2预训练好的模型检测与匹配线段(自己的数据集)

    文章目录 前言 使用流程 检测与匹配结果 前言 论文链接 SOLD2 Self supervised Occlusion aware Line Description and Detection 论文源码 https github com
  • Spyder 运行时kernels启动报错

    1 报错如下 An error ocurred while starting the kernel Your Python environment or installation doesn t have the spyder kernel
  • 表格增删查改使用ajax请求后端数据并没有更新的问题

    1 如果使用的是vue 那么先检查你的表格有没有使用v model实现数据双向绑定 2 使用ajax请求 因为ajax默认使用的是异步请求 也就是客户端请求给服务端时 客户端不需要等待也可以做其他事情 这是我实现添加的代码 其中标框的asy
  • MySQL在线大表DDL操作

    MySQL在线大表DDL操作的方法 1 主从架构轮询修改 a 主库会话级别的记录binglog的参数关闭 b 500 502错误异常捕捉 c 检查备库的second behind master是否有延迟 d varchar有页分裂的情况 尽
  • 【linux 异常断电】进入了emergency mode解决办法

    系统异常断电关机 导致启动时进入了emergency mode 解决办法 1 查看日志或报错信息 查看日志 journalctl 按他的操作输入journalctl之后输入shift g到日志最后查看报错发现是xfs sda3有问题 发现
  • ES6关于函数详解

    设置默认值的方式 ES6 之前 不能直接为函数的参数指定默认值 只能采用变通的方法 ES6 允许为函数的参数设置默认值 即直接写在参数定义的后面 function log x y World console log x y log Hell
  • 基于SpringBoot的共享单车管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SpringBoot 前端 采用HTML和Vue技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Ec
  • 《剑指Offer》62:圆圈中最后剩下的数字(约瑟夫环)

    题目 0 1 2 n 1这n个数字排成一个圆圈 从数字0开始 每次从这圆圈你删除第m个数字 求出这个圆圈里剩下的最后一个数字 例如 0 1 2 3 4这5个数字组成一个圆圈 从数字0开始每次删除第3个数字 则删除的前4个数字依次2 0 4
  • 踩了大坑:https 证书访问错乱

    文章目录 一 问题排查及解决 问题一 证书加载错乱 问题二 DNS 解析污染问题 问题三 浏览器校验问题 二 终极解决方法 2 1 可外网访问域名 2 2 只能内网访问域名 2 3 内网自动化配置 2 4 错误解决 一 问题排查及解决 今天