踩了大坑: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 证书访问错乱 的相关文章

  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 为什么 fopen("any_path_name",'r') 不给出 NULL 作为返回值?

    在调试一些代码时 我得到如下内容 include
  • PHP-FPM 和 Nginx:502 错误网关

    配置 Ubuntu 服务器 11 10 64 位 亚马逊AWS Ec2 托管在云上 t1 micro实例 在我写任何其他内容之前 我想声明我已经检查了两者nginx 502 错误网关 https stackoverflow com ques
  • 使用 shell 脚本将行附加到 /etc/hosts 文件

    我有一个新的 Ubuntu 12 04 VPS 我正在尝试编写一个安装脚本来完成整个 LAMP 安装 我遇到问题的地方是在 etc hosts文件 我当前的主机文件如下所示 127 0 0 1 localhost Venus The fol
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • 获取请求的客户端 IP 地址而不是 Cloudflare 的 IP 地址

    Cloudflare 会更改传入请求的 IP 地址 因为 Cloudflare 是我的网站和互联网之间的中间件 代理 我该怎么办获取请求的初始IP地址 而不是 Cloudflare 的 IP 地址 我听说过mod cloudflare但是这
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 如何查找哪个 Yocto 项目配方填充图像根文件系统上的特定文件

    我经常与 Yocto 项目合作 一个常见的挑战是确定文件为何 或来自什么配方 包含在 rootfs 中 这有望从构建系统的环境 日志和元数据中得出 理想情况下 一组命令将允许将文件链接回源 即配方 我通常的策略是对元数据执行搜索 例如gre
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • Maven:无法传输文件 XXX 返回代码为: 501 ,ReasonPhrase:HTTPS 必需

    我在构建 Maven 项目时收到意外的 501 错误代码 该消息显示需要 HTTPS 但我没有更改我的 settings xml 如何检查我的配置是否发生更改 我怎样才能让事情正常运转 其原因解释于Maven 依赖项失败并出现 501 错误
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser
  • 具有多处理功能的 Python 代码无法在 Windows 上运行

    以下简单的绝对初学者代码在 Ubuntu 14 04 Python 2 7 6 和 Cygwin Python 2 7 8 上运行 100 但在 Windows 64 位 Python 2 7 8 上挂起 我使用另一个片段观察到了同样的情况
  • 跨 CPU 内核的 rdtsc 精度

    我从一个线程发送网络数据包 并在运行于不同 CPU 核心上的第二个线程上接收回复 我的流程测量每个数据包发送和接收之间的时间 类似于 ping 我使用 rdtsc 来获得高分辨率 低开销的计时 这是我的实现所需要的 所有测量结果看起来都很可
  • 如何找到进程启动时使用的原始用户名?

    有一个 perl 脚本需要以 root 身份运行 但我们必须确保运行该脚本的用户最初没有以用户 foo 身份登录 因为它将在脚本运行期间被删除 那么 我如何查明自登录以来可能已多次起诉的用户是否在该链中的任何时间都没有模拟过 foo 我发现

随机推荐

  • 安装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 错误解决 一 问题排查及解决 今天