C++ 在libcurl ssl请求中发送客户端证书时遇到问题,我缺少什么?

C++ 在libcurl ssl请求中发送客户端证书时遇到问题,我缺少什么?,c++,ssl,libcurl,C++,Ssl,Libcurl,我正在尝试向需要客户端证书的Web服务器发送客户端证书 如果我从命令行curl命令发出请求,它就会工作。 我传递了--key文件名和--cert文件名,一切正常 当我从libcurl库执行此操作时,我会执行以下操作: curl_easy_setopt(curl, CURLOPT_SSLCERT, client_cert_file.c_str()); curl_easy_setopt(curl, CURLOPT_SSLKEY, client_key_file.c_str());

我正在尝试向需要客户端证书的Web服务器发送客户端证书

如果我从命令行curl命令发出请求,它就会工作。 我传递了--key文件名和--cert文件名,一切正常

当我从libcurl库执行此操作时,我会执行以下操作:

    curl_easy_setopt(curl, CURLOPT_SSLCERT, client_cert_file.c_str());
    curl_easy_setopt(curl, CURLOPT_SSLKEY, client_key_file.c_str());
同样的事情,服务器说客户端证书丢失了

我试着做一些事情,比如给它一个不存在的文件名,希望引发一些其他错误消息,这些消息可能会给我一个错误的线索,但是当出现错误时,使用verbose on的libcurl(以及命令行curl)不会产生任何错误消息。当然有失败的案例,但没有任何东西会让我犯下任何错误

有没有办法从libcurl中获得更多诊断信息

把我剩下的头发拔出来

这是在Windows10上的顺便说一下,我们自己构建了libcurl。SSL是内置的,https连接可以工作,我只是无法让它发送客户端证书,也没有迹象表明出了什么问题

更新:

我想我发现了我的问题


有人知道怎么做吗?

好吧,我想了个办法

事实证明,您可以使用openssh或schannel在windows上构建libcurl。 如果使用schannel,则CURLOPT_SSLCERT和CURLOPT_SSLKEY什么都不做。(请注意,没有警告或错误。) 也许他们确实做了些什么,关于schannel,但我找不到任何关于这方面的文件

因此,简而言之,如果您使用openssl构建libcurl,您可以提供一个客户端证书,以便在TLS握手中发送

这里有一条线索:


在curl 7.60.0()中添加了对CURLOPT_SSLCERT与WinSSL/SChannel的支持

作为缔约国:

客户端证书必须由证书存储的路径表达式指定。[…]您可以使用“\\”引用系统证书存储中的证书,例如,“CurrentUser\MY\934a7ac6f8a5d579285a74fa61e19f23ddfe8d7a”。[…]支持以下存储位置:CurrentUser、LocalMachine、CurrentService、Services、CurrentUserGroupPolicy、LocalMachineGroupPolicy、LocalMachineEnterprise


这项功能是在2018年5月16日发布的curl 7.60中添加的(详情请参见我的答案)。是的,但我正在寻找一种使用旧式点对点证书文件机制的方法。我花了一段时间才意识到以这种方式编译是不可能的。