我已经使用 API 有一段时间了,大多数时间该调用都可以正常进行,然而偶尔(每天 1 到 2 次,持续大约一小时,虽然完全无法预测何时调用、持续多长时间!)我会收到以下错误消息:
“发生错误:SSL:没有替代证书主题名称与目标主机名‘api.xxxxx.com’匹配”
我一直在使用来自我的服务器和外部的预定调用来监控 API,同时还使用 Runscope 和 Postman 手动监控。当我的服务器调用出现问题时,Runscope 和 Postman 不会提示这是我这边的问题。
仅供参考,我正在使用 PHP 从 Linux 服务器查询 api,以使用 file_get_contents 和 Curl 运行基本身份验证 - 两种方法都显示相同的问题。
与超级乐于助人的 api 所有者开发团队合作后发现,使用 openssl 命令后:
回显 | openssl s_client -showcerts -servername api.XXXXX.com -connect api.XXXXX.com:443 2>/dev/null | openssl x509 -inform pem -noout -text
我的服务器以某种方式将 api 的域指向我自己的,即该命令输出我自己的 ssl 证书而不是 api 的证书。
有人知道如何解决这个问题和/或防止这种情况再次发生吗?
答案1
主题备用名称是将一个证书用于多个虚拟主机的一种方式 - 您在连接到服务器时本质上会收到名称不匹配错误,在某些时候,您正在连接到证书一无所知的安全 URL,请将所有 API 端点 URL 粘贴到此检查器中https://www.digicert.com/help/
如果您有一个 api myapi.example.com 和一个签名的证书,那么您就无法对 myotherapi.example.com 进行安全调用,除非您将 myotherapi.example.com 声明为主题备用名称,或者您有一个通配符证书。
它每天只执行一次这一操作,这可能是为了平衡负载,如果你在负载平衡池中有 2 个或更多服务器,请确保对两个服务器都应用了 SSL 卸载 - 否则负载平衡器可能会偶尔将你引导到具有自签名证书的主机(如果你已加密负载平衡器和主机之间的通道) - 如果服务器是负载均衡和两个服务器的 SSL 都已正确卸载 - 然后确保 apache ServerName 完全相同,即不是 api1.example.com 和 api2.example.com
最后确保只有一个 DNS 条目指向负载均衡器的虚拟 IP