CNAME记录指向vercel影响了CAA记录导致的SSL证书无法签发的问题
直接看解决方案
最狠的:直接把dns中有关vercel全暂停了
或者:先暂停二级域名对vecel的解析,即暂停example.com->vecel
然后再暂停受影响的子域的vecel 即暂停 a.example.com->vecel
问题
今天阿里云告知我有一个域名的SSL证书快过期了,已经是老手的我熟练地打开阿里云控制台申请证书。
但是发生了一件怪事,以往证书都能在一分钟下发,而这一次等了好久都不行。我决定先睡一觉起来再看看。
睡醒以后,打开阿里云控制台,发现还是不成功,此时我仍然怀疑是阿里云的锅。于是我用freessl再申请了一次,等到下午还是没成功。用myssl.com/检测的结果如下:
地区 | 是否匹配 |
---|---|
中国 | 不匹配 (验证失败,您的CAA配置不允许当前CA为您签发证书,请修改为:symantec.com或digicert.com) |
香港 | 不匹配 (验证失败,您的CAA配置不允许当前CA为您签发证书,请修改为:symantec.com或digicert.com) |
美国 | 不匹配 (验证失败,您的CAA配置不允许当前CA为您签发证书,请修改为:symantec.com或digicert.com) |
我没设置过CAA记录啊!
我心想应该不是DNS缓存的问题吧?不可能啊!
但是我还是到阿里云控制台把所有的DNS记录都暂停解析。
结果,居然成功了!成功了!
后经过排查发现是解析到vercel上的cname记录导致的问题发生,这是为啥呢?vercel还有权限帮我设置CAA记录!?
原因
后经一番搜索终于知道了原因,就是因为CAA记录惹的祸
CAA(Certificate Authority Authorization),即证书颁发机构授权。是一项新的可以添加到DNS记录中的额外字段,通过DNS机制创建CAA资源记录,可以限定域名颁发的证书和CA(证书颁发机构)之间的联系。未经授权的第三方尝试通过其他CA注册获取用于该域名的SSL/TLS证书将被拒绝。
域名设置 CAA 记录,使网站所有者,可授权指定CA机构为自己的域名颁发证书,以防止HTTPS证书错误签发,从而提高网站安全性。
补充一个知识点,CNAME记录会影响CAA记录:
CAA 记录检查继续对指向不同域的 CNAME 记录进行。在此例中,www.example.com 指向 www.example.net ,后者也有 CAA 记录:
(Example 7 / www.example.com)
Domain Record type Flags Tag Value
www.example.com. CNAME www.example.net
www.example.net. CAA 0 issue ";"
(Result: CAA failed)
第一个记录将 CAA 检查转向 www.example.net。此 CAA 记录可阻止任何 CA 颁发证书,证书办法机构无法为 www.example.com 颁发证书。
如果所指向的域 (www.example.net) 没有 CAA 记录,则 CAA 记录检查将上攀到基本域 (example.com)。
(Example 8 / www.example.com)
Domain Record type Flags Tag Value
www.example.com. CNAME www.example.net
example.com. CAA 0 issue "amazon.com"
(Result: CAA passed)
用白话说就是因为设置了cname指向vercel,而vercel设置了CAA记录,从而影响了我们的域名的CAA记录,用工具查询后发现确实如此:
{
"canIssue": false,
"status": "IssueMismatch",
"domain": "czqu.net",
"queryAt": "Sep 30, 2021 11:21:55 AM",
"elapsed": 1,
"caaRecordSet": [
{
"domain": "czqu.net",
"caaRecords": [
{
"issuerCritical": 0,
"tag": "issue",
"value": "letsencrypt.org",
"type": 257,
"dclass": 1,
"ttl": 60
},
{
"issuerCritical": 0,
"tag": "issue",
"value": "globalsign.com",
"type": 257,
"dclass": 1,
"ttl": 60
}
]
}
]
}
因此阿里云使用的免费DigiCert 证书颁发机构无法给我的域名颁发证书。