ssl peer certificate或ssh remote key不行 - C

时间:2014-07-30 15:37:18

标签: c++ curl libcurl

我有以下代码连接到网站:

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证书使用者名称'名称或服务器'与目标主机不匹配

2 个答案:

答案 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");

这使您可以按预期使用证书的方式使用证书;如果那是你的目标。