curl: (60) SSL: no alternative certificate subject name matches target host name
我不明白这个错误。如果我提供 CA 证书(带有
--cacert
选项),它甚至没有主题备用名称。如果它有一个,它肯定不会与目标主机名(我的服务器)匹配。
另一方面,如果我提供我的 server 证书,并用 CA 签名,它会显示:
SSL certificate problem: unable to get local issuer certificate.
(这是我所期望的,因为我的计算机默认情况下不信任 CA,这是正确的。)
将 PEM 证书合并到一个文件中时,我遇到了相同的错误。
使用选项
--capath
设置为具有 server 和 CA 证书的目录,它再次显示:curl: (60) SSL certificate problem: unable to get local issuer certificate
。
如何进行信任检查?
(使用单个自签名服务器证书时有效。)
这里有两个不同且几乎不相关的事情。
对于使用 OpenSSL 的 curl,就像您的一样,root 证书(通常是 CA)必须位于
--cacert
指定的文件中,或者位于 --capath
目录中 使用由 8- 组成的特殊文件名 hexit 规范化主题名称的截断哈希加上点和零(如果发生冲突,则为一个小数字),或者如果未指定,则使用默认值;除非(至少)存在其中之一,否则您会收到“无法获取本地发行人”错误;
并且,服务器发送的 server 证书(通常不是 CA 证书)必须包含(如果存在的话)SubjectAltName (SAN) 扩展名中的主机名,否则包含在 subject.CommonName (CN) 中的主机名,该主机名与您尝试访问的URL。如果服务器证书包含 SAN 扩展,但该扩展中没有条目与 URL 匹配,您会在标题中看到错误;参见例如Curl:修复 CURL (51) SSL 错误:没有替代证书主题名称匹配
自签名服务器证书与通常情况不同,因为它充当两者根证书和服务器证书,因此它必须同时位于
--cacert
或--capath
或它们的默认值中(即使正确地说它不是 CA)并包含与 URL 匹配的 SAN(或没有 CN)。
PS:如果您无法确定服务器正在发送什么证书(可能是因为配置很复杂,或者不确定是否已重新启动或刷新),请使用
openssl s_client -connect $host:$port -servername $host 2>&1 | openssl x509 -noout -text
# if OpenSSL version 1.1.1 you can omit -servername $host
使用wget。
--ca-certificate=path/to/PEM/ca/cert