申请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 的问题。翻了一下日志,发现大量错误:

  1. 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提示的更多相关文章

  1. 【原创】免费申请SSL证书【用于HTTPS,即是把网站从HTTP改为HTTPS,加密传输数据,保护敏感数据】

    今天公司有个网站需要改用https访问,所以就用到SSL证书.由于沃通(以前我是在这里申请的)暂停了免费的SSL证书之后,其网站推荐了新的一个网站来申请证书,所以,今天因为刚好又要申请一个证书,所以, ...

  2. .io域名在申请SSL证书时被坑

    注:标题其实与最后内容不符,只是描述一个事实 - 遇到坑了,不代表观点 - io域名坑我. .io后缀的域名是英属印度洋领地的国别域名,由NIC.io(runby Internet Computer ...

  3. 腾讯云域名申请+ssl证书申请+springboot配置https

    阿里云域名申请 域名申请比较简单,使用微信注册阿里云账号并登陆,点击产品,选择域名注册 输入你想注册的域名 进入域名购买页面,搜索可用的后缀及价格,越热门的后缀(.com,.cn)越贵一般,并且很可能 ...

  4. 申请SSL证书

    1.为什么需要申请SSL证书呢? 因为之前公司网站是通过http访问的,现在要通过https方式访问,前面多了一个s,那就需要SSL证书,用https方式访问的,会加密用户上传和下载的数据,使访问更加 ...

  5. 阿里云申请SSL证书 并部署到SpringBoot项目

    前提 有一台阿里云的服务器(安装了java环境) 有已经备案的域名,并且域名绑定上面的服务器 申请SSL证书 申请教程:https://blog.csdn.net/yunweifun/article/ ...

  6. 阿里云申请ssl证书配置tomcat访问https

    首先去阿里云上面申请ssl证书,免费的,自己百度去. 申请完ok之后会让你下载一个压缩包,里面有四个文件. 在tomcat安装目录下创建cert文件夹,把这四个文件扔进去 在conf/server.x ...

  7. 使用acme.sh从Let's Encrypt申请SSL证书

    Let's Encrypt 简介 Let's Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为 ...

  8. 超详细网站博客域名和二级域名、子域名升级HTTPS免费申请SSL证书配置nginx指南

    随着互联网的飞速发展,我们的工作生活已经离不开互联网,HTTP虽然使用极为广泛, 但是存在不小的安全缺陷, 主要是其数据的明文传送和消息完整性检测的缺乏, 而这两点恰好是网络支付,网络交易等网站应用中 ...

  9. Linux服务系统申请SSL证书方法

    inux主要面向专业性较强的技术人员,如果是WEB站点通常采取PHP语言为主选,可选的服务器环境中有Apache.Nginx.Tomcat这几类为主的框架环境,有的图方便会用一些可视化一键式的控制面板 ...

随机推荐

  1. ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python)

    ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python) 时隔1年,再回来总结这个问题,因为它是ros+python开发中,太常用的一个操作,需要 ...

  2. web session 原理1

     原理 我们都知道,浏览器无状态的.浏览器是操作不了session的,浏览器能够做的只是传递cookie,每次都传递. 把当前主机下的,和当前请求相同域下的cookie 传递到服务器去,只要cooki ...

  3. iOS重写和成员变量访问权限

    一.重写机制 1.覆盖父类的方法 2.对父类方法做进一步的补充 注意:父类声明过得方法,子类无需声明. * 子类如果重写了父类的方法: 1.父类的指针指向子类的对象,则调用方法时,调用的是子类的方法: ...

  4. DataBinding(二):DataBinding的基本用法

    转自:DataBinding系列(二):DataBinding的基本用法 1.在xml中引入一些基础变量Variables data 标签中可以有任意数量的 variable 标签.这些变量可以使Ja ...

  5. jquery ligerUI中ligerComboBox 初始值问题

    ligerComboBox项目中运用总结内容如下: $("#selectId").ligerComboBox({ data: proData, initValue: 0});这就默 ...

  6. delphi RTTI 四 获取类属性列表

    delphi RTTI 四 获取类属性列表 GetPropList(btn1.ClassInfo, tkAny, PropList) PropCount := GetTypeData(btn1.Cla ...

  7. es6初级之解构----之二 及 键值反转实现

    1.解构: 不定参数,扩展表达式 let arr = [100, 201, 303, 911]; let [one, ...others] = arr; console.log(others.leng ...

  8. SED命令用法整理

    sed '/Started/'q  匹配到Started字符串则退出sed命令 sed '/Started/{/in/q}'  同时匹配到Started和in两个字符时则退出sed命令 ------- ...

  9. ReactiveX 学习笔记(3)转换数据流

    Transforming Observables 本文的主题为转换 Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(二)Transform ...

  10. 【372】Kaggle 相关经验

    参考:机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾 参考:Kaggle泰坦尼克特征工程和模型融合 『解决一个问题的方法和思路不止一种』『没有所谓的机器学习算法优劣,也没有绝对高性能的机器 ...