在libcurl ssl请求中发送客户端证书时遇到问题,我错过了什么?

时间:2018-04-12 15:31:39

标签: c++ ssl libcurl

我正在尝试将客户端证书发送到需要它的网络服务器。

如果我从命令行curl命令发出请求,它可以工作。 我传递了--key filename和--cert filename,一切正常。

当我从libcurl库中执行此操作时,我执行此操作:

    curl_easy_setopt(curl, CURLOPT_SSLCERT, client_cert_file.c_str());
    curl_easy_setopt(curl, CURLOPT_SSLKEY, client_key_file.c_str());

同样的事情,服务器说缺少客户端证书。

我尝试过做一些事情,比如给它一个不存在的文件名,希望能引发一些其他的错误信息,这些信息可能会让我知道什么是错的,但是libcurl(以及命令行卷曲)和详细信息不会产生任何错误出现问题时的消息。当然有一个失败的案例,但没有任何事情可以让我跟进任何错误。

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

拉出我的头发留在这里。

这是在Windows 10上的方式,我们自己建立了libcurl。 SSL是内置的,https连接工作,我只是无法让它发送客户端证书,并且没有迹象表明出现了什么问题。

更新:

我想我发现了我的问题......

https://curl.haxx.se/docs/todo.html#Add_support_for_client_certifica

有人知道如何使这项工作吗?

2 个答案:

答案 0 :(得分:2)

好的,所以我解决了一些问题。

事实证明,你可以使用openssh或schannel在windows上构建libcurl。 如果使用schannel,则CURLOPT_SSLCERT和CURLOPT_SSLKEY不执行任何操作。 (没有任何警告或错误提醒你。) 也许他们确实做了一些与schannel相关的事情,但我找不到任何关于这方面的文档。

因此,如果您使用openssl构建libcurl,您可以提供客户端证书以在TLS握手中发送。

小费是在这里:

https://curl.haxx.se/docs/todo.html#Add_support_for_client_certifica

答案 1 :(得分:0)

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

documentation for CURLOPT_SSLCERT指出:

  

客户端证书必须由证书存储的路径表达式指定。 [...]您可以使用“ <存储位置> \ <存储名称> \ <缩略图>”来引用系统证书存储中的证书,例如“ CurrentUser \ MY \ 934a7ac6f8a5d579285a74fa61e19f23ddfe8d7a”。 [...]支持以下商店位置:CurrentUser,LocalMachine,CurrentService,服务,CurrentUserGroupPolicy,LocalMachineGroupPolicy,LocalMachineEnterprise。