我有以下代码连接到网站:
int main()
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "https://192.168.200.115:8080/appliances");
curl_easy_setopt(curl, CURLOPT_USERNAME, "myusername");
curl_easy_setopt(curl, CURLOPT_PASSWORD, "mypassword");
curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
// Perform the request, res will get the return code
res = curl_easy_perform(curl);
// Check for errors
if(res != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
//always cleanup
curl_easy_cleanup(curl);
}
return 0;
}
运行时我得到错误:对等证书无法使用给定的ca证书进行身份验证
谷歌搜索后,我发现我必须添加一行:
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
BUt现在我收到错误: ssl对等证书或ssh远程密钥不正常
我尝试过添加:
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2);
但仍然是同样的错误。
我该如何解决这个问题?
修改 我添加了详细记录:
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
现在我在输出中看到以下内容: ssl证书使用者名称'名称或服务器'与目标主机不匹配
答案 0 :(得分:2)
服务器发送的X.509 SSL服务器证书无效。如果你真的想要禁用X.509证书验证(请不要这样做),你应该将CURLOPT_SSL_VERIFYHOST设置为0(默认为2),以便在证书中包含的名称确保libcurl不会失败时与您尝试连接的主机不匹配。 如果你这样做,你可能不得不让CURLOPT_SSL_VERIFYPEER为0,这意味着没有X.509 PKI验证。
答案 1 :(得分:0)
许多建议不要将CURLOPT_SSL_VERIFYHOST和CURLOPT_SSL_VERIFYPEER设置为零。他们说,这给中间人攻击留下了空间。 OTOH通过中央机构验证证书也可能对隐私滥用开放,因为它们可以用来跟踪用户访问的网站,无论所述机构是否可以真正解密其内容。
这个答案:
Can't connect to HTTPS site using cURL. Returns 0 length content instead. What can I do?
为我解决了。似乎libcurl的作者为您提供了openSSL的需求,但是openSSL只提供了过时的版本。 openSSL有一个用于重新生成证书颁发机构的工具,一个名为c_rehash
的脚本,但是,如果不愿意使用该新贵操作系统Windows的用户,他们就不会提供.bat或其他Windows脚本版本。上面的SO回答很容易在命令行上连接到“ C”和C ++。在页面上
curl - Extract CA Certs from Mozilla
它具有指向最近生成的“ cacert.pem”文件的链接。这是直接链接:http://curl.haxx.se/ca/cacert.pem
使用它的“ C”和C ++版本为:
curl_easy_setopt(curlHandle, CURLOPT_CAINFO,
"C:/Programming/Original/QT Projects/libcurlTest/libcurlTest/openssl/cacert.pem");
这使您可以按预期使用证书的方式使用证书;如果那是你的目标。