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

rad*_*adj 10 security macos https keychain libcurl

我的代码试图访问HTTPS服务器,它有自己的证书.例如,IP是"10.0.1.101".

如果我通过Safari并访问"http://10.0.1.101",一切都没问题.我为这个URL做了一个简单的curl_easy_perform(),可以从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以获取证书?如果是这样,怎么样?

Dan*_*erg 5

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

Mac Keychain 的实现没有什么特别的魔法。

  • 真的吗?那么,这是*奇怪的*。我运行 Mountain Lion 的机器“正常工作”并且可以很好地识别证书,但是我运行 Yosemite 的机器*不行*。 (2认同)

小智 5

curlMac OS上的“新” 不会“看”系统钥匙串数据库(旧的curl版本与-E选件配合使用时效果很好)。

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

brew install curl
Run Code Online (Sandbox Code Playgroud)

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

然后是这样的:

/usr/local/opt/curl/bin/curl -E wlad https://mail.securedbyclientcertificate.com/access/
Run Code Online (Sandbox Code Playgroud)

(在“ -E钥匙串”数据库中键入客户证书的名称)

Mac OS将询问您从钥匙串读取的权限,键入您的MacOS密码,然后选择“始终允许”。

  • 即使是“brew install curl”中的最新版本也不支持从钥匙串中读取。我必须安装到特定版本才能使其正常工作。在这里记录下来,以防有人真的需要它。`brew extract --version=7.69 curl homebrew/cask` 和 `brew install curl@7.69` (4认同)

Pie*_*erz 5

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

CURL_SSL_BACKEND=secure-transport curl --cert "My Cert" htps://10.0.1.101/
Run Code Online (Sandbox Code Playgroud)