如何解决子域调用主域Webhook时的证书域名不匹配错误?
问题根源分析
错误提示Hostname/IP does not match certificate's altnames: Host: exampledomain.com. is not in the cert's altnames: DNS:api.exampledomain.com的核心原因是:从api.exampledomain.com发起的主域请求,并没有真正发往Vercel服务器,而是被你的DigitalOcean服务器上的NGINX反向代理拦截,返回了api子域的SSL证书。
解决步骤
1. 修正NGINX服务器域名匹配规则
- 打开api.exampledomain.com对应的NGINX配置文件(通常路径为
/etc/nginx/sites-available/api.exampledomain.com或/etc/nginx/conf.d/api.conf) - 检查
server_name配置,确保严格指向子域,避免泛域名匹配:
替换掉可能存在的server_name api.exampledomain.com;server_name *.exampledomain.com;这类会覆盖主域的规则。 - 重启NGINX生效:
sudo systemctl restart nginx
2. 验证服务器DNS解析正确性
- 在DigitalOcean服务器上执行以下命令,确认主域解析到Vercel的IP:
nslookup exampledomain.com - 如果返回的是当前DigitalOcean服务器的IP,说明DNS解析异常:
- 检查服务器
/etc/hosts文件,确认没有错误绑定exampledomain.com到本地IP - 清空本地DNS缓存,例如Debian/Ubuntu系统执行:
sudo systemd-resolve --flush-caches - 更换服务器DNS为公共DNS(如8.8.8.8),修改
/etc/resolv.conf文件后生效
- 检查服务器
3. 测试服务器端请求链路
- 在DigitalOcean服务器上直接发起请求,查看证书信息:
curl -v https://exampledomain.com/api/revalidate - 查看输出中的证书部分,确认返回的是
exampledomain.com的证书(SAN字段包含该域名),而非api子域的证书。如果仍返回api子域证书,说明NGINX或DNS的问题未解决。
4. 确认主域DNS配置正确性
- 检查主域
exampledomain.com的DNS记录,确保A/AAAA记录正确指向Vercel提供的IP地址,没有错误指向DigitalOcean服务器。
补充说明
- 本地Postman调用正常:因为请求直接发往Vercel服务器,未经过DigitalOcean的NGINX拦截,能获取正确证书。
- 子域调用webhook.site正常:请求发往第三方服务器,不会被自身NGINX规则匹配,所以链路正常。
内容的提问来源于stack exchange,提问作者Douwe Pausma
相关产品推荐
相关产品推荐

