配置 cURL 以使用 Windows 上的默认系统证书库

Configure cURL to use default system cert store on Windows

我有一个使用 libcurl-4 dll 的命令行应用程序,目前我可以通过将我的 CA 证书放在我的工作目录中并将它们的名称传递给 CUTLOPT_CAINFO 来让一切正常工作和 CURLOPT_SSLCERT 的名字加上 ./ 前缀。

但是,我正在做的是让 cURL 不使用当前目录中的内容,而是使用存储在我的计算机系统存储中的证书。

通过阅读 cURL 的文档,我了解到如果您配置它时没有给出指定的默认值 ca-bundleca-path,ti 将 "auto-detect a setting"。

并且 CURLOPT_CAINFO 默认设置为 "built-in system specific"

所以谁能帮我理解:

  1. 如果在配置 curl 时没有指定任何内容,它检测系统存储的默认路径是什么?或者 curl 是否使用自己的系统存储路径?

  2. 你给curl_easy_setopt(m_curlHandle, CURLOPT_CAINFO, *<value> )什么值让CURLOPT_CAINFO去使用它的默认值?

感谢任何帮助,因为我仍在学习这一切是如何工作的。

谢谢。

OpenSSL 不支持单独使用 Windows 的 "CA certificate store"。如果您希望 curl 构建使用该证书存储,则需要重建 curl 以改用 schannel 后端(又名 "winssl"),这是 Windows 本机版本也使用 Windows 默认证书存储。

如果您决定继续使用 OpenSSL,您必须在 PEM 文件或特制目录中提供 CA 证书,因为 Windows 不使用您必须获得的格式提供其系统存储从某个地方找到合适的商店或弄清楚如何将 Windows 证书商店转换为 PEM 格式。

更新

从 libcurl 7.71.0 开始,定于 2020 年 6 月 24 日发布,它将能够在构建为使用 OpenSSL 时使用 Windows CA 证书存储。然后您需要使用 CURLOPT_SSL_OPTIONS 选项并在位掩码中设置正确的位:CURLSSLOPT_NATIVE_CA.

自 2018 年 4 月起,对于那些想要使用 Windows 命令行下载文件的用户,可以使用 Curl.exe 可执行文件。从Windows 10 build 17063 及更高版本开始,包含Curl 以便您可以直接从Cmd.exePowerShell.exe 执行它。

curl.exe -V
curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL
Release-Date: [unreleased]
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL 

小心使用 PowerShell Cmdlet Invoke-WebRequest 的别名是名称 curl,因此取消此 CmdLet (Remove-item alias:curl) 的别名或明确使用 curl.exe.

据我了解,curl.exe 是使用 Schannel(Microsoft 的原生 TLS 引擎)构建的,然后 libcurl 仍然执行对等证书验证,但它不使用 CA 证书包,而是使用的证书是内置于 OS.

curl.exe  "https://www.7-zip.org/a/7z1805-x64.exe"  --output c:\tempzip.exe
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1404k  100 1404k    0     0  1404k      0  0:00:01 --:--:--  0:00:01 9002k