【问题标题】:How to make libcurl look in the Mac Keychain for certificates如何使 libcurl 在 Mac 钥匙串中查找证书
【发布时间】:2011-09-16 01:10:44
【问题描述】:

我的代码正在尝试访问 HTTPS 服务器,并且它有自己的证书。例如,IP 为“10.0.1.101”。

如果我通过 Safari 访问“http://10.0.1.101”,一切正常。我为这个 URL 做了一个简单的 curl_easy_perform() 并且可以从 HTTP URL 中提取数据。很酷。

然后我尝试从 Safari 访问“https://10.0.1.101”(是的,HTTPS),我接受证书并为其提供“信任”选项,之后,Safari 访问 HTTPS URL 就可以了.

因此,证书已添加到 Mac 钥匙串中,但是当我在 HTTPS URL 上尝试 curl_easy_perform() 时,它仍然返回 CURLE_SSL_CACERT。 libcurl 无法使用已知 CA 证书验证 HTTPS 证书。

libcurl 的证书检查和 Mac 钥匙串之间缺少什么链接?甚至有链接吗?是否可以让 libcurl 查看 Mac 钥匙串以获取证书?如果有,怎么做?

【问题讨论】:

  • 我们可以使用 CURLOPT_CAINFO 选项来指向一个钥匙串文件吗?
  • 终端中有一个security 命令,我认为您可以使用该命令的输出来获取信任链。 (我不是证书或终端专家,在脚本中尝试过,它适用于 curl)
  • @Marcelo Alves,谢谢。这看起来是一个很好的起点,但如果可以的话,你能分享一下你是如何做到的吗?
  • 我已经在用户和系统钥匙串上尝试了“security add-trusted-cert PathToPEMFile.pem”,但 libcurl 仍然失败。

标签: macos security https libcurl keychain


【解决方案1】:

Mac OS 上的“新”curl 不会“查看”系统钥匙串数据库(旧的 curl 版本与 -E 选项配合得很好)。

您仍然可以在较新版本的 Mac OS 上使用 curl

brew install curl

(安装与从钥匙串读取的客户端证书一起使用的 curl 版本)

然后是这样的:

/usr/local/opt/curl/bin/curl -E wlad https://mail.securedbyclientcertificate.com/access/

(在 -E 中,您在 Keychain 数据库中键入您的客户端证书的名称)

Mac OS 会询问您是否允许从钥匙串中读取,输入您的 MacOS 密码并选择“始终允许”..

【讨论】:

  • 呸!这很有帮助。
  • 我正在使用 macOS 10.15.5 的新 Macbook。我有 MacPorts,但使用 curl 的“本机”版本。当我尝试 d/l 最新的youtube-dl:sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl 时,我收到证书过期错误。他 youtube-dl 维护者说他们的证书是有效的并且是最新的。我该如何解决这个问题?
  • 即使brew install curl 的最新版本也不支持从钥匙串读取。我必须安装到特定版本才能使其工作。在这里记录它以防有人真的需要它。 brew extract --version=7.69 curl homebrew/caskbrew install curl@7.69
【解决方案2】:

不。为使用 OpenSSL 而构建的 libcurl 只会从单个 PEM 文件或已准备好 OpenSSL 样式的 CA 证书目录中读取 CA 证书。

实现的 Mac 钥匙串没有什么特别的魔力。

【讨论】:

  • 真的吗?那么,这很奇怪。我运行 Mountain Lion 的机器“正常工作”并且可以很好地识别证书,但我运行 Yosemite 的机器不行
  • 请注意,这个答案是在 2011 年发布的,因此 libcurl 当时不支持 OS X 钥匙串。
猜你喜欢
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多