スポンサーリンク

VC++でlibcurlを使う(https OpenSSLの場合)

libcurlをlibssl.lib+libcrypto.libで再ビルド

前回OpenSSLをビルドしてlibssl.libとlibcrypto.libを作ったので、それらをリンクしたlibcurl.libをビルドする。

前々回のlibcurlのビルドで、プロジェクト設定を以下のように変更する。

まずLIB Release - LIB OpenSSL を選択。

libssl.lib ; libcrypto.libを依存ファイルとして設定。それらがあるライブラリディレクトリを指定。

opensslのincludeディレクトリを指定。

libcurlをリンクしてプログラムをビルド

以上でlibcurlをビルドできたので、これを使ったプログラムをビルドしてみる。

ライブラリを設定

curlのlibファイルのディレクトリに加え、opensslのlibファイルのディレクトリも追加してビルドする。

以下の二つを追加ライブラリディレクトリに設定

  • D:\myDevelop\oss\curl-8.0.1\build\Win64\VC14.10\LIB Release - LIB OpenSSL
  • D:\myDevelop\oss\src\openssl-install\lib

 

pemファイルの準備

以下から、cacert.pemをダウンロードして、カレントディレクトリに配置する。

https://curl.se/docs/caextract.html

 

サンプルコード

#include <iostream>

#define CURL_STATICLIB 
#include<curl/curl.h>

// OS提供
#pragma comment(lib, "CRYPT32.LIB")
#pragma comment(lib, "wldap32.lib" )
#pragma comment(lib, "Ws2_32.lib")

// 作成したlibcurl
#pragma comment(lib,"libcurl.lib")

// 作成したopenssl
#pragma comment(lib,"libssl.lib")
#pragma comment(lib,"libcrypto.lib")


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

bool PerformHttpsRequest(const std::string& url, std::string& response) {
    CURL* curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();

    if (!curl) {
        std::cerr << "Error: Failed to initialize libcurl." << std::endl;
        return false;
    }
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);

    /// /////////
    // 相手がhttpsの場合、以下五行を入れないと SSL peer certificate or SSH remote key was not OK というエラーが出る。
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYSTATUS, 1);
    curl_easy_setopt(curl, CURLOPT_CAINFO, R"(.\cacert.pem)");
    curl_easy_setopt(curl, CURLOPT_CAPATH, R"(.\cacert.pem)");
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1L);
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

    res = curl_easy_perform(curl);

    if (res != CURLE_OK) {
        std::cerr << "Error: curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
        curl_easy_cleanup(curl);
        curl_global_cleanup();
        return false;
    }

    curl_easy_cleanup(curl);
    curl_global_cleanup();
    return true;
}

int main() {
    std::string url = "https://suzulang.com/";
    std::string response;

    if (PerformHttpsRequest(url, response)) {
        std::cout << "Response from " << url << ":" << std::endl;
        std::cout << response << std::endl;
    }

    return 0;
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: