当你启用CDN后,浏览器却提示SSL证书错误,常见的报错包括“证书不匹配”或“SSL_ERROR_BAD_CERT_DOMAIN”,这通常意味着CDN节点返回的证书与访问的域名不一致。证书不匹配是CDN配置中最容易踩坑的问题之一,但排查路径相对清晰。本文将从证书链、域名、协议等角度逐层排查,帮助你快速定位并解决。
确认CDN节点证书是否属于你的域名
首先,你需要确认CDN节点返回的证书是否覆盖了你访问的域名。打开浏览器开发者工具,在“安全”或“证书”面板查看证书详情,检查“主题”和“主题备用名称”(SAN)是否包含你的域名。如果证书是其他域名的,说明CDN配置错误或证书未正确关联。
常见误区:有些CDN提供“通用证书”或“共享证书”,仅覆盖特定域名,如果你的域名不在其中,就会报错。此时应改用“专用证书”或上传自有证书。
检查源站证书链是否完整
如果CDN节点证书正常,但回源时源站证书不匹配,也会导致SSL错误。CDN回源时会验证源站证书,如果源站证书链不完整(缺少中间证书),或证书与源站域名不匹配,CDN会拒绝连接或返回错误。
操作步骤:登录源站服务器,使用命令openssl s_client -connect 源站域名:443 -showcerts查看证书链。确认输出中包含完整的证书链,且证书的CN或SAN与源站域名一致。
验证源站域名是否与证书完全匹配
证书不匹配的另一个常见原因是源站域名与证书中的域名不一致。例如,源站使用IP地址访问,但证书只签发了域名;或者使用了泛域名证书,但源站域名不在覆盖范围。
判断方法:查看证书的SAN列表,确认是否包含源站域名(包括子域名)。如果使用IP访问,需确保证书包含IP或使用回源Host指定域名。
检查CDN回源协议设置
CDN回源协议通常有“HTTP”、“HTTPS”和“跟随”等选项。如果源站仅支持HTTP,但CDN设置回源为HTTPS,则可能因证书不匹配而失败。反之,如果源站要求HTTPS,但CDN使用HTTP回源,则可能返回明文内容,但不会报证书错误。
建议:在CDN控制台将回源协议设为“HTTPS”,并确保源站证书有效。如果源站不支持HTTPS,可考虑使用“HTTP”但配合CDN的HTTPS访问,但需注意安全性。
排查CDN边缘节点缓存导致的过期证书
有时证书已更新,但CDN边缘节点仍缓存旧证书,导致访问时出现不匹配。这属于缓存问题,可通过清除CDN缓存解决。参考Cloudflare缓存文档,你可以强制刷新缓存以获取最新证书。
操作:在CDN控制台清除所有缓存,或使用API purge缓存。如果问题依旧,可尝试等待缓存过期或联系CDN支持。
常见误区与注意事项
- 误区1:证书不匹配只发生在源站。实际上,CDN节点证书配置错误同样会触发。
- 误区2:泛域名证书覆盖所有子域名。泛域名证书仅覆盖一级子域名,不覆盖二级及以上。
- 误区3:证书过期后会立即报错。有些客户端可能容忍一定时间,但最终会报错。
- 注意:如果使用了CDN的“灵活SSL”模式,即CDN到用户是HTTPS,但CDN到源站是HTTP,则不会出现证书不匹配,但安全性降低。
高级排查:使用Workers调试证书
如果常规排查无效,可以使用Cloudflare Workers编写一个简单的脚本,模拟请求源站并检查证书。例如,使用fetch API访问源站,并捕获证书错误。这可以帮助定位是CDN还是源站的问题。
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
try {
const response = await fetch('https://your-origin.com', {
cf: { resolveOverride: 'your-origin.com' }
})
return response
} catch (e) {
return new Response(e.message, { status: 502 })
}
}
如果返回的报错信息包含证书相关描述,则问题在源站;否则可能在于CDN配置。
总结与后续建议
证书不匹配的排查需从CDN节点、源站证书、域名匹配、协议设置和缓存等多方面入手。优先检查节点证书和源站证书链,然后是域名匹配和回源协议。若问题持续,可借助Workers进行深度调试。另外,定期更新证书并监控有效期,可减少此类错误。
参考资料
延伸阅读
