在libcurl中使用PKCS#12导入的客户端证书

时间:2018-07-31 16:50:20

标签: c++ libcurl client-certificates pem pkcs#12

使用libcurl,当我尝试使用以p12格式提供给我的客户端证书时,当前遇到SSL连接错误(curl_easy_perform返回的CURLE_SSL_CONNECT_ERROR,curl_easy_strerror返回的“ SSL连接错误”)。 我已经找到了很多与此主题相关的资源,但是没有提出的解决方案对我有用。 我目前在Windows 10的Visual Studio 2017中运行我的代码,但它的目标是跨平台。

这是我到目前为止所做的:

  1. 从p12文件生成PEM证书:

    openssl pkcs12 -in * .p12 -out crt.pem -clcerts -nokeys

  2. 从p12文件生成PEM密钥:

    openssl pkcs12 -in * .p12 -out key.pem -nocerts -nodes

我的C ++代码如下:

curl_easy_setopt( vCurl, CURLOPT_URL,               vURL.c_str()    );
curl_easy_setopt( vCurl, inMethod,                  1L              ); 
curl_easy_setopt( vCurl, CURLOPT_PORT,              inPort          );
curl_easy_setopt( vCurl, CURLOPT_SSL_VERIFYPEER,    0               );
curl_easy_setopt( vCurl, CURLOPT_FOLLOWLOCATION,    1L              );

curl_easy_setopt( vCurl, CURLOPT_SSLCERTTYPE, "PEM" );
curl_easy_setopt( vCurl, CURLOPT_SSLCERT,     "/absolute/path/crt.pem"  );
curl_easy_setopt( vCurl, CURLOPT_SSLKEYTYPE,  "PEM" );
curl_easy_setopt( vCurl, CURLOPT_SSLKEY,      "/absolute/path/key.pem"  );

curl_easy_setopt( vCurl, CURLOPT_WRITEFUNCTION, CurlWrite_CallbackFunc_StdString );
curl_easy_setopt( vCurl, CURLOPT_WRITEDATA, &vResponse );

vCurlResult = curl_easy_perform( vCurl );

string vDetails = curl_easy_strerror(vCurlResult);
curl_easy_getinfo ( vCurl, CURLINFO_RESPONSE_CODE, &vHttpCode );

这将导致上述错误。我已经对代码进行了一些整理,以使它更专注于有问题的部分,但是我认为我并没有忘记包含任何重要的内容。另外,请注意,这是我的个人CURL包装器的一部分,该包装器已经广泛使用,包括HTTPS url,并且除了此客户端证书管理问题外,它还可以正常工作。

我还分析了与Wireshark握手期间交换的消息,客户端似乎没有发送其证书:指示的证书长度为0。

您是否知道我可以尝试什么?也许我使用的CURL选项有问题?还是我应该使用的一些选项? 谢谢

0 个答案:

没有答案