申请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. hadoop启动问题分析

    hadoop的安装和启动很简单直接解压进行安装 配置文件就好了,但是启动问题就很多,总结下无非以下两点: 第一点:无论你是群起还是单起;都首要格式化   bin/hdfs namenode -form ...

  2. IIS w3wp对应的应用程序

    IIS7以前我們用IISApp查看IIS哪些服務已啟動,但在IIS7已經不適用了,新語法是appcmd.exe list wp.你可以在%windir%\system32\inetsrv\底下找到ap ...

  3. java判断字符串中是否包含中文 过滤中文

    package com.test; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test ...

  4. Loadrunner:win10下Vuser 运行脚本通过,Controller执行用户并发报错

    现象:win7安装LR可以正常使用,将win7升级到win10之后,运行场景之后报错:Error (-81024): LR_VUG: The 'QTWeb' type is not supported ...

  5. 《算法》第三章部分程序 part 3

    ▶ 书中第三章部分程序,加上自己补充的代码,红黑树 ● 红黑树,大部分方法与注释与二叉树相同 package package01; import java.util.NoSuchElementExce ...

  6. markdown的试用

    因为markdown,我接触到latex,因为latex,我花了几个月去看相关的书籍 我看了以下相关的资料 1.<LaTeX入门> 刘海洋 2.英文 TeX - LaTeX Stack E ...

  7. 小程序登录&授权&获取用户信息

    一 .登录 时序图如下: wx.login() 获取js_code 示例代码: App({   onLaunch: function() {     wx.login({       success: ...

  8. 【JEECG技术文档】JEECG高级查询构造器使用说明

    功能介绍   高级查询构造器支持主子表联合查询,查询出更精确的数据. 要使用高级查询构造器需要完成以下步骤: 1. 在高级查询管理配置主子表信息. 2. 配置完后在JSP页面DataGrid标签上添加 ...

  9. 创建模式--原型模式(JAVA)

    原型模式: 原型模式主要针对模型对象类型的克隆,对已有构造好的对象进行复制获取一个新的对象实例.比如我们在获取一个对象并成功赋值后,要传递给多个处理类去处理. 打个比方:吃面是个处理类,面是个模型对象 ...

  10. Python集合的基本操作

    #-*coding:utf-8 -* list =set([2,3,4]) list2 =set([5,3,7]) #交集 #print (list.intersection(list2)) #并集 ...