申请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. [PHP-DI] 理解依赖注入

    理解依赖注入 依赖注入 和 依赖注入容器 是不同的: 依赖注入 (Dependency injection) 是编写更好代码的一种方法 容器 (Container) 是帮助注入依赖关系的工具 你不需要 ...

  2. Python学习笔记_week3_函数

    一.介绍 1.面向对象(华山派)--->类(独门秘籍)--->class(定义的关键字) 2.面向过程(少林派)--->过程--->def 3.函数式编程(逍遥派)---> ...

  3. docker tomcat镜像制作

    推荐使用dockerfile(本文直接拉取tomcat需要进入容器自行安装vim):docker利用Dockerfile来制作镜像 1.查找Docker Hub上的tomcat镜像 [root@loc ...

  4. Mysql中select的正确姿势

    引言 大家在开发中,还有很多童鞋在写查询语句的时候,习惯写下面这种不规范sql select * from table 而不写成下面的这种规范方式 select col1,col2,...,coln ...

  5. react-native android app名字 app包名、图标和启动图片设置

    1.设置名字 打开 android/app/src/main/res/values/strings.xml 如图,进行修改即可 2.设置图标,最简单可以直接替换,其他后在看 在上图中几个文件夹中都有一 ...

  6. Django--views(视图层)

    路径匹配后-----传给视图函数 一.视图函数 视图层,熟练掌握两个对象即可:请求对象(request)和响应对象(HttpResponse) 一个视图函数,简称视图,是一个简单的Python 函数, ...

  7. django 之Paginator

    Django自身提供了一些类来实现管理分页,数据被分在不同的页面中,并带有“上一页/下一页”标签.这个类叫做Pagination,其定义位于 django/core/paginator.py 中. p ...

  8. byobu copy

    Copy and Paste in Scrollback mode (screen/byobu) Enter scrollback mode: F7 Move the cursor to the st ...

  9. Python 字符串基本操作

    字符串是Python的一种基本类型,字符串的操作包括字符串格式化输出.字符串的截取.合并,字符串的查找和替换等操作. 字符串定义 Python中有3种表示字符串的方法:单引号.双引号.三引号.引号使用 ...

  10. pip安装提示PermissionError: [WinError 5]错误问题解决

    操作环境   Python3.6 + Winodws7 问题现象 新安装python3.6版本后使用pip安装第三方模块失败,报错信息如下: C:\Users\linyfeng>pip inst ...