如何在 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 数组时,同样的逻辑也适用。
我正在尝试将 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 数组时,同样的逻辑也适用。