curl --cacert 错误“curl:(60) SSL:没有替代证书使用者名称与目标主机名匹配”

问题描述 投票:0回答:2

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
设置为具有 serverCA 证书的目录,它再次显示:
curl: (60) SSL certificate problem: unable to get local issuer certificate

如何进行信任检查?

(使用单个自签名服务器证书时有效。)

ssl curl
2个回答
3
投票

这里有两个不同且几乎不相关的事情。

对于使用 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

0
投票

使用wget。

--ca-certificate=path/to/PEM/ca/cert

© www.soinside.com 2019 - 2024. All rights reserved.