curl: (60) SSL: no alternative certificate subject name matches target host name
我不明白这个错误。如果我提供了一个CA证书(带有--cacert
选项),它甚至没有主题可选名称。如果它有一个,那么它肯定与目标主机名(我的服务器)不匹配。
另一方面,如果我提供与 CA 签名的服务器证书,它会写成:SSL certificate problem: unable to get local issuer certificate.
(这是我所期望的,因为我的计算机默认不信任CA,这是正确的)。
当将PEM证书组合到一个文件中时,我会得到相同的错误。
使用选项--capath
设置为具有服务器和CA证书的目录,它再次声明:curl: (60) SSL certificate problem: unable to get local issuer certificate
。
如何使信任检查有效?
(它在使用单个自签名服务器证书时起作用。)
发布于 2020-07-28 07:14:43
这里有两种不同的几乎不相关的东西。
对于使用OpenSSL的curl,如您所用,根证书(通常是CA)必须位于--cacert
指定的文件中,或者在--capath
目录中使用特殊的文件名,该文件名由规范化主题名加点和零(或如果不指定的话是一个小数字)和0(或如果没有指定的话是一个小数字)的8 hexit截断散列组成;除非(至少)其中一个文件存在,否则您将得到“无法获得本地颁发者”错误;
而且,服务器发送的服务器证书(通常不是CA证书)必须在SubjectAltName (SAN)扩展名中(如果存在),在Subject.CommonName (CN)中包含与您试图访问的URL中的主机名匹配的主机名。如果服务器证书包含SAN扩展,但该扩展名中没有与URL匹配的条目,则在标题中会出现错误;参见Fix CURL (51) SSL error: no alternative certificate subject name matches
自签名服务器证书与通常情况不同,因为它同时充当根证书和服务器证书,因此它必须在--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
https://stackoverflow.com/questions/63101263
复制相似问题