申请ssl证书报提示caa提示
申请ssl证书报下面提示caa提示,这和dns有关,换一组dns重新申请
send challenge err[acme error 'urn:acme:error:connection': DNS problem: SERVFAIL looking up CAA for
什么是 CAA 记录呢,它全称是 Certification Authority Authorization ,用于申明只允许特定的 CA 为域名发布证书。在 CA 发布证书的过程中,CA 机构应该检查这个域名的 CAA 记录,如果某个域名存在 CAA 记录,但是 CA 机构的域名不在这个列表里,就应该停止签发证书。CAA 记录是可选的,如果权威 DNS 不返回 CAA 记录则说明任何 CA 机构都可以为该域名发布证书。
起因
之前搭了一个 IPSec 的 VPN,为了避免需要在客户端导入根证书,使用了 Let's Enrypt 来签署免费证书。这样客户端不用导入自签名的根证书就能正常地认证,用起来很舒服。
今天早上起来发现 VPN 登录不了了,看了一下日志,发现是因为证书过期了,上服务器更新证书,certbot 报 "SERVFAIL looking up CAA for example.com",之前 certbot 也报过类似的错误,但是其实是其他错误导致的,不过这次经过反复尝试,以及用 dig 测试:
dig -t TYPE257 example.com
发现我的 PowerDNS 确实是返回了一个 SERVFAIL。
调查
首先我的 PowerDNS 其实很久没动了,为啥之前可以正常地签证书、更新证书呢。原因是上个月 Let's Encrypt 发布了一个 申明 ,宣布其更新了对 CAA 记录的支持。
什么是 CAA 记录呢,它全称是 Certification Authority Authorization ,用于申明只允许特定的 CA 为域名发布证书。在 CA 发布证书的过程中,CA 机构应该检查这个域名的 CAA 记录,如果某个域名存在 CAA 记录,但是 CA 机构的域名不在这个列表里,就应该停止签发证书。CAA 记录是可选的,如果权威 DNS 不返回 CAA 记录则说明任何 CA 机构都可以为该域名发布证书。
之前 Let's Encrypt 对于 CAA 查询的策略是,如果权威 DNS 返回 SERVFAIL,则认为该服务器不支持 CAA,则跳过 CAA 的检查。但是这样显然是有一些隐患的,权威 DNS 返回 SERVFAIL 不一定是因为 DNS 服务器不支持,也有可能是因为 DNS 出现了问题(或者被恶意攻击),在这样的场景下,Let's Encrypt 有可能会错误地签发不应该签发的证书。
因此,在确认大部分 DNS 服务提供者都支持 CAA 记录之后,Let's Encrypt 修改了自身的策略,当权威 DNS 返回 SERVFAIL 的时候则直接拒绝签发证书。不过我的 DNS 是自己在 CentOS 7 上建的 PowerDNS,看起来它并不支持 CAA。
解决方案1
上服务器检查了一下 pdns 的版本,是从 EPEL 安装的 3.4.8,而 EPEL 中最新的版本是 3.4.11。根据 PowerDNS 的 changelog 来看,从 4.0.0 开始 PowerDNS 才开始支持 CAA 记录。
所幸 PowerDNS 自己的 软件仓库 中已经有了 4.0 版本的 pdns,直接添加软件源, yum update 一下就有了 pdns 4.0.4。
不过奇怪的是 CAA 请求依然得到的是 SERVFAIL。之后我又尝试了 master 分支的 pdns,结果依然。
解决方案2
既然如此,那就添加一个 CAA 记录试试吧。Poweradmin 有一个 issue 中提到了这个 PR 已经添加了 CAA 记录的支持,而这个 PR 已经被 merge 了。不过 poweradmin 的上一个 release 还是 2014 年发布的,至今已经有 3 年没有发布新版本了。无它,从 master 分支下载代码,在 poweradmin 里已经可以添加 CAA 记录了。
根据 RFC ,CAA 记录由两部分组成:一个 flags 和 一个 tag 对。flags 是一个字节,当前只有最高位被用于 Issuer Critical,代表这个 tag 对的重要性,即如果 CA 不理解这个 tag 对,应该停止签证书(1)或忽略这个 tag 对(0)。需要注意的是 Issuer Critical 是最高位,因此实际上的 flags 应该分别是 128 或 0,
当前支持的 tag 包括:issue issuewild iodef。
issue 表示允许 CA 机构签署证书,issuewild 表示允许 CA 机构签署 wildcard 证书,iodef 表示签署证书时通过指定的方式通知域名持有者。
Let's Encrypt 暂时还不支持 wildcard,所以 issuewild 暂时没什么意义;iodef 是可选的,并且据说 Let's Encrypt 还不支持 iodef。
综上,在 Poweradmin 里添加一个 CAA 记录,context 填入 128 issue "letsencrypt.org" 即可。关于这个 CAA 记录的域名,根据 Let's Encrypt 的 文档 ,可以放到需要签证书域名的父域名下,Let's Encrypt 会进行递归查询。另外 CA 域名必须填 letsencrypt.org,这个在文档中也有提到。
接下来重新运行 certbot renew ,续命成功!
解决方案3
虽然问题解决了,我还是不满足,为什么 4.0.4 的 Powerdns 依然返回 SERVFAIL 呢?根据 这里 来看,Powerdns 4.0.4 已经彻底解决了 CAA 请求 SERVFAIL 的问题。翻了一下日志,发现大量错误:
- Backend error: GSQLBackend unable to list metadata: Could not prepare statement: select content from domains, domainmetadata where domainmetadata.domain_id=domains.id and name=? and domainmetadata.kind=?: Table 'powerdns.domainmetadata' doesn't exist
对比了一下数据库里的 table 列表和 pdns-mysql-backend 带的 schema 里的 table 列表,发现缺了不少表,不过有意思的是,其他查询依然能够正常进行。于是补上了所有缺的表,删掉了之前添加的 CAA 记录,经过测试,发现这时候返回的状态变成了 NOERROR。
综上,所有的问题都解决了,如果遇到类似的问题,可以作为一个参考。
至于为啥数据库缺表,这个 Powerdns 是其他人装的,这件事就无从考证了。
申请ssl证书报提示caa提示的更多相关文章
- 【原创】免费申请SSL证书【用于HTTPS,即是把网站从HTTP改为HTTPS,加密传输数据,保护敏感数据】
今天公司有个网站需要改用https访问,所以就用到SSL证书.由于沃通(以前我是在这里申请的)暂停了免费的SSL证书之后,其网站推荐了新的一个网站来申请证书,所以,今天因为刚好又要申请一个证书,所以, ...
- .io域名在申请SSL证书时被坑
注:标题其实与最后内容不符,只是描述一个事实 - 遇到坑了,不代表观点 - io域名坑我. .io后缀的域名是英属印度洋领地的国别域名,由NIC.io(runby Internet Computer ...
- 腾讯云域名申请+ssl证书申请+springboot配置https
阿里云域名申请 域名申请比较简单,使用微信注册阿里云账号并登陆,点击产品,选择域名注册 输入你想注册的域名 进入域名购买页面,搜索可用的后缀及价格,越热门的后缀(.com,.cn)越贵一般,并且很可能 ...
- 申请SSL证书
1.为什么需要申请SSL证书呢? 因为之前公司网站是通过http访问的,现在要通过https方式访问,前面多了一个s,那就需要SSL证书,用https方式访问的,会加密用户上传和下载的数据,使访问更加 ...
- 阿里云申请SSL证书 并部署到SpringBoot项目
前提 有一台阿里云的服务器(安装了java环境) 有已经备案的域名,并且域名绑定上面的服务器 申请SSL证书 申请教程:https://blog.csdn.net/yunweifun/article/ ...
- 阿里云申请ssl证书配置tomcat访问https
首先去阿里云上面申请ssl证书,免费的,自己百度去. 申请完ok之后会让你下载一个压缩包,里面有四个文件. 在tomcat安装目录下创建cert文件夹,把这四个文件扔进去 在conf/server.x ...
- 使用acme.sh从Let's Encrypt申请SSL证书
Let's Encrypt 简介 Let's Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为 ...
- 超详细网站博客域名和二级域名、子域名升级HTTPS免费申请SSL证书配置nginx指南
随着互联网的飞速发展,我们的工作生活已经离不开互联网,HTTP虽然使用极为广泛, 但是存在不小的安全缺陷, 主要是其数据的明文传送和消息完整性检测的缺乏, 而这两点恰好是网络支付,网络交易等网站应用中 ...
- Linux服务系统申请SSL证书方法
inux主要面向专业性较强的技术人员,如果是WEB站点通常采取PHP语言为主选,可选的服务器环境中有Apache.Nginx.Tomcat这几类为主的框架环境,有的图方便会用一些可视化一键式的控制面板 ...
随机推荐
- HPROF - Heap Profile
基于动态链接库实现,可用于性能分析,锁内容.诊断memory leak问题等.获得堆开辟信息 java -agentlib:hprof=heap=sites ToBeProfiledClass 帮助文 ...
- 键值对操作 之 combineByKey
combineByKey( createCombiner,mergeValue,mergeCombiners,partitioner) combineByKey() 是最为常用的基于键进行聚合的函数. ...
- [C基础修炼]如何用vs2017写一个C语言hello world程序
从微软官网下载vs2017安装后,打开 文件>新建>项目>Visual C++空项目(选择名称,位置)确定>找到源文件 鼠标右击>添加>新建项>Visual ...
- Java快速开发平台,JEECG 3.7.6性能增强版本发布
JEECG 3.7.6 性能增强版本发布 导读 ⊙Vue SPA单页面应用 ⊙Datagrid标签实现不同风格切换,支持BootstrapTable.EasyUI ⊙灵活通用代码生成器工厂 ...
- vue-x action 的相互调用
实现方式:分发 Action Action 通过 store.dispatch 方法触发: store.dispatch('increment')
- C#反射机制详解
反射的定义:审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,System.Reflection命名空间包 ...
- js模板引擎初级
模板引擎:模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的html文档. 模板引擎的实现方式有 ...
- C语言复习:内存模型1
数据类型本质分析 数据类型概念 "类型"是对数据的抽象; 类型相同的数据有相同的表现形式/存储格式以及相关的操作; 程序中使用的所有数据都必定属于某一种数据类型; 数据类型本质思考 ...
- 2.ECS内 经典网络与VPC网络的区别
对应阿里云学习视频地址:https://help.aliyun.com/video_detail/67686.html?spm=5176.208355.1107604.1.10d82ca1J91Ckt ...
- [Shell]Bash基本功能:多命令顺序执行与管道符
/*----------------------------------------------------------------------------------------------- @黑 ...