繁体   English   中英

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

[英]How to use curl_blob in libcurl/ c++?

我正在尝试将 libcurl 与 c++ 一起使用,并使用 mTLS(双向 TLS/双向 TLS)发出请求。 将证书作为文件路径传递是可行的。 但我想在源代码中使用嵌入证书而不是外部文件。 我在 curl lib 网站(示例)中发现了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需要带有文件/字符串内容的char* stblob.len需要字符串/字符数组的长度。

这是一个简单的例子:

    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 数组时,同样的逻辑也有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM