DNS CAA 记录及创建方法

Wesley13
• 阅读 685

作者:gc(at)sysin.org,主页:www.sysin.org

关于 CAA

有一百多个被称为证书颁发机构的组织,可以颁发 SSL 证书来保证您的域的身份。如果您和大多数域所有者一样,您可能只从少数几个证书颁发机构获得证书。CAA(Certificate Authority Authorization,证书颁发机构授权)允许您声明您实际使用的证书颁发机构,禁止其他机构为您的域颁发证书。

以下是您使用 CAA 的一些原因:

  • 您希望降低来自不安全证书颁发机构的风险。您可以使用CAA将您的域限制为您信任的证书颁发机构,而您信任这些机构不会颁发未经授权的证书。

  • 您希望阻止员工从未经授权的供应商处获取证书。

设置 CAA 很容易。使用便捷的 CAA 生成器检查您授权的证书颁发机构。然后在域的 DNS 中发布生成的 DNS 记录。您的域需要由支持 CAA 的 DNS 提供商托管。幸运的是,主要的 DNS 提供商现在都支持 CAA。

CAA 是由 RFC 6844定义的 IETF 标准。自2017年9月8日起,所有公共证书颁发机构都必须遵守 CAA 记录。在为域颁发证书之前,他们必须检查域中的 CAA 记录,如果 CAA 记录集没有授权它们,则拒绝颁发证书。(如果没有 CAA 记录,则允许其发布。)

CAA 和子域

域的 CAA 记录集也适用于所有子域。如果子域有它自己的 CAA 记录集,它将优先。

例如,在证书颁发机构为颁发证书之前 www.example.com 网站,它将按以下顺序查询域中的 CAA 记录集,并使用它找到的第一个记录集:

www.example.com

example.com

CAA 和 CNAME

如果域名是另一个域的 CNAME(也称为别名),则证书颁发机构还会在 CNAME 目标以及目标的所有父域中查找 CAA 记录集。如果没有找到 CAA 记录集,证书颁发机构将继续搜索原始域名的父域。

例如,如果 blog.example.com 是的 CNAME blog.example.net,则证书颁发机构按以下顺序查找 CAA 记录集:

blog.example.net

example.net

example.com

局限性

不管 CAA 怎么说,一个恶意或完全被破坏的证书颁发机构都可以为您的域颁发证书。此外,DNS 记录可以被强大的***者欺骗,欺骗证书颁发机构认为它已被授权。

然而,在实践中,CAA 可以保护域所有者不受证书颁发机构中最近的许多安全漏洞的影响。尽管存在局限性,发布 CAA 政策是一种非常明智的安全措施。

为了增加保护,请使用证书透明度监视器(如 Cert Spotter)在颁发的证书违反您的 CAA 策略时向您发出警报。

支持 CAA 的 DNS

服务商

主流的域名服务商,国内如阿里云解析 DNSDSNPOD(腾讯云),国外如 Cloudflare、Azure DNS、AWS Route 53 和 Google Cloud DNS,都可以支持 CAA 记录。

更多厂商列表可以参考这里:https://sslmate.com/caa/support

软件

Software/Provider

Support

Comments

BIND

Yes

Prior to version 9.9.6 use RFC 3597 syntax

dnsmasq

Yes

Use --dns-rr option with hex data

Knot DNS

≥2.2.0

ldns

≥1.6.17

NSD

Yes

Prior to version 4.0.1 use RFC 3597 syntax

OpenDNSSEC

Yes

With ldns ≥1.6.17

PowerDNS

≥4.0.0

Versions 4.0.3 and below are buggy when DNSSEC is enabled.

Simple DNS Plus

≥6.0

tinydns

Yes

Use generic record syntax

Windows Server 2016

Yes

Use RFC 3597 syntax

CAA 记录格式

CAA 记录由以下元素组成:

标签

描述

flag

0-255 之间的无符号整数

tag

用来表示关键标志,RFC 有定义

value

与 tag 关联的值

CAA 记录的规范的表示法是:

CAA <flags> <tag> <value>

RFC 目前定义了 3 个可用的 tag:

  • issue:明确授权单个证书颁发机构颁发主机名的证书(任何类型)。
  • issuewild:明确授权单个证书颁发机构为主机名颁发通配符证书(只有通配符)。
  • iodef:指定认证机构可以向其报告策略违规的URL或邮箱。

创建 CAA 记录

可以使用 https://sslmate.com/caa/ 来生成,示例:

Name          Type  Value
sysin.org.  CAA   0 issue "digicert.com"
                  0 issue "letsencrypt.org"

添加 CAA 记录

  • 记录类型选择 CAA

  • Name或者主机记录填写 @ 表示顶级域名,会自动应用到多级域名。

  • 记录值填写 0 issue "证书颁发机构域名"
    如果如果你用 Let's Encrypt 颁发的免费证书,CAA data 部分直接填写 0 issue "letsencrypt.org" 即可。

    允许多个证书颁发机构,添加多条即可。

  • 你还可以添加一条为 0 iodef "mailto:你的邮箱" 的 CAA 记录,表示如果发现违背 CAA 记录的情况给这个邮箱发邮件通知。

检测

dig

# dig sslmate.com caa

; <<>> DiG 9.11.13-RedHat-9.11.13-5.el8_2 <<>> sslmate.com caa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21947
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sslmate.com.                   IN      CAA

;; ANSWER SECTION:
sslmate.com.            7200    IN      CAA     0 issue "sectigo.com"
sslmate.com.            7200    IN      CAA     0 issuewild ";"
sslmate.com.            7200    IN      CAA     0 iodef "mailto:security@opsmate.com"
sslmate.com.            7200    IN      CAA     0 issue "letsencrypt.org"

nslookup

# nslookup
> set type=caa
> sslmate.com
Server:         183.60.83.19
Address:        183.60.83.19#53

Non-authoritative answer:
sslmate.com     rdata_257 = 0 issuewild ";"
sslmate.com     rdata_257 = 0 iodef "mailto:security@opsmate.com"
sslmate.com     rdata_257 = 0 issue "letsencrypt.org"
sslmate.com     rdata_257 = 0 issue "sectigo.com"

Authoritative answers can be found from:

使用 SSL Test 在线检测,会提示:

DNS Certification Authority Authorization (CAA) Policy found for this domain.  MORE INFO »
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Stella981 Stella981
3年前
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法
Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法参考文章:(1)Google地球出现“无法连接到登录服务器(错误代码:c00a0194)”解决方法(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.codeprj.com%2Fblo
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这