Wednesday, February 2, 2022

[SOLVED] Curl in C++ - Can't get data from HTTPS

Issue

When I trying to get data from HTTPS with code

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

string* NetIO::getUrlContent(string URL) {

    CURL *curl;
    CURLcode res;
    string *s = new string("");

    curl = curl_easy_init();
    if (curl) {
        //curl_easy_setopt(curl, CURLOPT_URL, URL);         
        curl_easy_setopt(curl, CURLOPT_URL, "https://ya.ru/");
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, s);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);

    }

    return s;
}

It can't receive content of HTTPS response and write it to the s variable - s contains "". But if I change URL to HTTP - this code works very well and s contains HTML code of the page.

curl_easy_setopt(curl, CURLOPT_URL, "http://tatarstan.shop.megafon.ru/");

How to fix this issue?

Thank you! ❤

UPDATE: If I add

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);

Than my code works well. Why it can't work without CURLOPT_SSL_VERIFYPEER=0?

I have some Visual Studio solution. It contains 2 project - libcurl, that compiled with settings: enter image description here enter image description here enter image description here

and second project, that depends on libcurl project: enter image description here


Solution

Solved! Thanks to @hank!

My solution is:

1) Open your site in Google Chrome, open certificate info.

2) Export it and each of his parent certs as X.509. Concat cert files into the one cert file - make cert chain.

3) Use file with cert chain with the code

curl_easy_setopt(curl, CURLOPT_CAINFO, "c:\\Art\\Projects\\LifeSimLauncher\\MyStaticLib\\lifesim.biz.crt.cer");


Answered By - Arthur
Answer Checked By - Terry (WPSolving Volunteer)