如何使libcurl在Mac Keychain中查找证书

12

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

如果我通过Safari访问“http://10.0.1.101”,一切正常。我尝试使用curl_easy_perform()访问此URL,数据可以从HTTP URL中提取。很好。

然后,我尝试访问“https://10.0.1.101”(是的,是HTTPS),并且在Safari中,我接受证书并给出“信任”选项,之后,Safari可以访问HTTPS URL。

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

libcurl证书检查与Mac Keychain之间缺少什么联系?是否存在联系?是否可以使libcurl查找Mac Keychain中的证书?如果可以,如何操作?


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

10

最新版的Mac OS上的“新”curl无法查找系统Keychain数据库(旧版本的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将要求您获取访问Keychain的权限,请输入您的MacOS密码并选择“始终允许”。


1
哎呀!那真是太有帮助了。 - Abe
1
我正在使用macOS 10.15.5的新Macbook。我安装了MacPorts,但是使用“本地”的curl版本。当我尝试下载最新的youtube-dl时:sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl,我遇到了证书过期错误。youtube-dl维护者表示他们的证书有效且更新至最新状态。我该如何解决这个问题? - user5395338
4
即使是brew install curl中的最新版本也不支持从钥匙串中读取内容。我必须安装特定版本才能让它工作。在这里记录下来,以防有人真正需要。使用命令 brew extract --version=7.69 curl homebrew/caskbrew install curl@7.69 - ghitesh
我们可以像这样指定证书 CURL_CA_BUNDLE=./cacert.pem curl 'https://local.io/'。更多信息请参见 https://curl.se/docs/sslcerts.html。 - ahuigo

5

在当前的MacOS版本中,您可以使用CURL_SSL_BACKEND环境变量告诉系统已安装的curl使用Keychain,例如使用来自Keychain的命名客户端证书(它将弹出一个Keychain身份验证对话框):

CURL_SSL_BACKEND=secure-transport curl --cert "My Cert" htps://10.0.1.101/

5

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

没有Mac Keychain的特殊魔法实现。


2
真的吗?那么,这很奇怪。我的运行Mountain Lion的机器“只是工作”,并且可以很好地识别证书,但是我的运行Yosemite的机器则无法使用。 - Michael
1
请注意,此答案是在2011年发布的,因此libcurl当时不支持OS X钥匙串。 - WeZZard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接