踩了大坑:https 证书访问错乱
Posted 杰哥的技术杂货铺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了踩了大坑:https 证书访问错乱相关的知识,希望对你有一定的参考价值。
文章目录
一、问题排查及解决
今天遇到这样一个问题,问题的经过是这样的:
同一台服务器里,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 作为记录值。
注意事项:
-
- 由于 DNS 记录不会马上生效,所以稍后再按回车键。
-
- 使用 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免费证书
以上是关于踩了大坑:https 证书访问错乱的主要内容,如果未能解决你的问题,请参考以下文章
踩了大坑 : go json.Marshal时,结构体字段需要大写