使用libcurl,当我尝试使用以p12格式提供给我的客户端证书时,当前遇到SSL连接错误(curl_easy_perform返回的CURLE_SSL_CONNECT_ERROR,curl_easy_strerror返回的“ SSL连接错误”)。 我已经找到了很多与此主题相关的资源,但是没有提出的解决方案对我有用。 我目前在Windows 10的Visual Studio 2017中运行我的代码,但它的目标是跨平台。
这是我到目前为止所做的:
从p12文件生成PEM证书:
openssl pkcs12 -in * .p12 -out crt.pem -clcerts -nokeys
从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选项有问题?还是我应该使用的一些选项? 谢谢