【问题标题】:curl --cacert error "curl: (60) SSL: no alternative certificate subject name matches target host name"curl --cacert 错误“curl:(60)SSL:没有替代证书主题名称与目标主机名匹配”
【发布时间】:2020-11-15 22:54:09
【问题描述】:

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

如何进行信任检查?

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

【问题讨论】:

  • 有一个边缘情况,错误消息确实有意义:使用自签名证书时。那行得通(那是我以前的设置),当时我没有看到任何错误
  • 也许问题是我的服务器不发送证书链,而只发送服务器一个。我会尝试在那里添加CA证书
  • 不,问题是一样的
  • 我遇到了类似的问题:“curl: (51) SSL: no alternative certificate subject name matches target host name 'myserver.something'” 虽然它在 SAN 列表中。我发现当我在 SAN 中使用第一个 DNSName 时,它​​确实有效。我不知道这是否是一个已知问题,但在我的情况下,curl 似乎没有检查 SAN 中的所有 DNS 名称。

标签: ssl curl


【解决方案1】:

这里有两个不同且几乎不相关的东西。

对于使用 OpenSSL 的 curl,就像您的一样,root 证书(通常是 CA)必须在 --cacert 指定的文件中,或者在 --capath 目录中使用特殊文件名,由规范化主题名称的 8 位十六进制截断散列加上点和零(如果冲突则为小数字)组成,或者如果未指定,则为默认值;除非(至少)其中之一存在,否则您会收到“无法获取本地发行者”错误;

并且,服务器发送的 server 证书(通常不是 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

【讨论】:

  • 自签名服务器证书在您编写时有效(使用--cacert)。但是当我切换到自签名的 ca(并且也使用了--cacert)时,我的问题标题中出现了错误。
  • 您的命令输出:X509v3 extensions: X509v3 Subject Alternative Name: DNS:my.ip.addr.ess 所以它应该可以工作。也许它有问题,当 SAN 不是域,而是 IP 地址时?我没有域名,我到处都用这个地址。
  • 我的 iPhone 没有任何问题,然后切换到 wget ,它可以工作。
【解决方案2】:

使用 wget。 --ca-certificate=path/to/PEM/ca/cert

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 2021-08-23
    • 1970-01-01
    • 2014-01-17
    • 2017-08-20
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多