如何在 libcurl/c++ 中使用 curl_blob?

How to use curl_blob in libcurl/ c++?

我正在尝试将 libcurl 与 c++ 一起使用,并尝试使用 mTLS(相互 TLS/双向 TLS)发出请求。将证书作为文件路径传递是可行的。但我想在源代码中使用嵌入式证书而不是外部文件。我在 curl 库网站 (example)

中发现了 BLOB 选项

网站上还有一个使用了curl_blob结构的例子:

CURL *curl = curl_easy_init();
if(curl) {
  struct curl_blob stblob;
  stblob.data = certificateData; // What to pass here (e.g. from a string)
  stblob.len = filesize; // What about here?
  stblob.flags = CURL_BLOB_COPY;
  curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
  curl_easy_setopt(curl, CURLOPT_SSLCERT_BLOB, &stblob);
  curl_easy_setopt(curl, CURLOPT_SSLCERTTYPE, "P12");
  curl_easy_setopt(curl, CURLOPT_KEYPASSWD, "s3cret");
  ret = curl_easy_perform(curl);
  curl_easy_cleanup(curl);
}

如何使用curl_blob结构及其属性?

我找到了解决方案。

stdblob.data 需要内容为 file/string 的 char*stblob.len 需要 string/char 数组的长度。

这是一个简单的例子:

    char* str_to_char_arr(string str)
    {
        const int n = str.length() + 1;

        char* char_array = new char[n + 1];

        for (int i = 0; i < n; i++)
            char_array[i] = str[i];

        return char_array;
    }

    std::string client_cert_content =
        "-----BEGIN CERTIFICATE-----\n"
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"
        ".....\n"
        "-----END CERTIFICATE-----";

    curl_blob get_client_cert()
    {
        struct curl_blob stblob;
        stblob.data = str_to_char_arr(client_cert_content);
        stblob.len = client_cert_content.length();
        stblob.flags = CURL_BLOB_COPY;

        return stblob;
    }

然后以这种方式添加证书:

struct curl_blob client_cert_blob = get_client_cert();
curl_easy_setopt(curl, CURLOPT_SSLCERT_BLOB, &client_cert_blob);

我想使用嵌入式证书,并且这种方式有效。但是从文件中读取 char 数组时,同样的逻辑也适用。