当前位置: 首页 > news >正文

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

文章目录

  • 一、问题排查及解决
    • 问题一:证书加载错乱
    • 问题二:DNS 解析污染问题
    • 问题三:浏览器校验问题
  • 二、终极解决方法
    • 2.1 可外网访问域名
    • 2.2 只能内网访问域名
    • 2.3 内网自动化配置
    • 2.4 错误解决

一、问题排查及解决

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

同一台服务器里,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 -e0 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:667drNmQL3vX6bu8YZlgy0wKNBlCny8yrjF1lSaUndcOnce 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.rpmyum install certbot
  • Ubuntu
apt-get update
apt-get install software-properties-common
add-apt-repository ppa:certbot/certbot
apt-get updateapt-get install certbot
  • Debian
apt-get update
apt-get install software-properties-common
add-apt-repository ppa:certbot/certbot
apt-get updateapt-get install certbot -t jessie-backports

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

http://www.lryc.cn/news/24192.html

相关文章:

  • 大数据技术之Hive(四)分区表和分桶表、文件格式和压缩
  • 环形缓冲区(c语言)
  • 创建自助服务知识库的指南
  • 分层测试(1)分层测试是什么?【必备】
  • 开源ZYNQ AD9361软件无线电平台
  • 第四阶段-12关于Spring Security框架,RBAC,密码加密原则
  • JPA——Date拓展之Calendar
  • 一文吃透 Spring 中的 AOP 编程
  • Apple主推的智能家居是什么、怎么用?一篇文章带你从零完全入门 HomeKit
  • SpringCloud系列知识快速复习 -- part 1(SpringCloud基础知识,Docker,RabbitMQ)
  • 2023上半年北京/上海/广州/深圳NPDP产品经理认证报名
  • 面试半年,总结了1000道2023年Java架构师岗面试题
  • 通过MySQL驱动拦截器实现执行sql耗时计算
  • 易基因|独家分享:高通量测序后的下游实验验证方法——DNA甲基化篇
  • java基础系列(七) 同步和异步理解
  • 吉林大学 程序设计基础 2022级 OJ期末考试 2.23
  • 【项目实战】SpringMVC拦截器实战 - 自定义拦截器防止重复提交
  • C++ STL:容器 Container
  • urllib之urlopen和urlretrieve的headers传入以及parse、urlparse、urlsplit的使用
  • 【C++】二叉搜索树的模拟实现
  • HNU工训中心:元器件及测量基础实验报告
  • 博客系统--自动化测试
  • Day903.自增主键不能保证连续递增 -MySQL实战
  • 02-MyBatis查询-
  • 外盘国际期货招商:2023年3月关注日历,把握重要投资机会
  • Linux学习(9.1)文件系统的简单操作
  • Hadoop综合案例 - 聊天软件数据
  • Python进阶-----面向对象1.0(对象和类的介绍、定义)
  • 天猫淘宝企业服务为中小微企业打造供应链智能协同网络,让采购不再将就!丨爱分析报告
  • 基于四信网络摄像机的工业自动化应用