libcurl -curl_easy_perform() 失败:SSL CA 证书有问题(路径?访问权限?)

问题描述 投票:0回答:2

我在 Windows 7 x64 上使用 mingw64 (MSYS2) 从下面的链接编译了简单的 libcurl 示例程序

https://curl.se/libcurl/c/simple.html

不幸的是它给了我错误:

curl_easy_perform() 失败:SSL CA 证书有问题(路径?访问权限?)

我尝试在MSYS2中重新安装开放的ssl证书,但没有成功。 请记住,我对 SSL 和证书完全是菜鸟!但我需要以可移植的方式在 C 中执行 HTTPS 请求,因此我被迫使用 libcurl。 我不认为我的系统有任何问题,因为 1. 使用 WinInet.h 发送的 https 请求工作正常 2. 我可以使用 cUrl command 发送 https 请求,没有任何问题。

PS。如果这里有类似的主题,我深表歉意,但据我所知,它们都没有解决这个特定场景中的相同问题

有什么想法吗?

openssl libcurl mingw-w64 msys2
2个回答
1
投票

我正在回答我自己的问题,因为最终我设法解决了问题,并希望这个问题对其他人有用。这实际上似乎是一个常见问题,尽管我找不到任何地方可以明确解决它并且对于新手(像我一样)。

该问题是由于libcurl基于openSSL造成的。 OpenSSL 是 Unix/Linux 的东西,不能在 Windows 上工作,除非显式安装适用于 Windows 的 openSSL(未经测试)。但人们可能不想强迫其软件的用户安装任何其他组件,例如 openSSL - 就像我的情况一样。

解决方案是构建一个不是基于 openSSL 而是基于 Windows SSPI 的 libcurl,或者找到合适的 libcurl 包。经过一番努力和搜索,我发现MSYS2存在这样一个包,它是mingw curlwinssl:

https://packages.msys2.org/package/mingw-w64-x86_64-curl-winssl?repo=mingw64

安装就足够了:

pacman -S mingw-w64-x86_64-curl-winssl

与 libcurl 静态链接可能很麻烦,而且看起来并没有清楚地列出所有依赖项(似乎是一个已知的错误)。特别是如果使用像我这样的 IDE 并且对 Linux 命令行一无所知(我正在使用 Code::Blocks),则有必要链接以下库:

-lcurl -lpsl -lidn2 -lssh2 -lbrotlidec -lz -liconv -lzstd -lbrotlicommon -lunistring -lbcrypt -lws2_32 -lwldap32 -lcrypt32

#define CURL_STATICLIB
(必填)

最后一点,我必须说,在任何 minGW 发行版中,恕我直言,libcurl 默认情况下应该基于 Windows,而不是基于 openSSL,因为它们被认为可以在 Windows 下工作并生成 Windows 可执行文件 - 但出于某些对我来说模糊的原因,这似乎情况并非总是如此。


0
投票

您可以从 https://curl.se/docs/caextract.html 获取名为 cacert.pem 的证书文件,并在您的程序中使用它,如下所示:

curl_easy_setopt(curl_handle, CURLOPT_CAINFO, "C:/curl_certificate/cacert.pem");
© www.soinside.com 2019 - 2024. All rights reserved.