我正在尝试将客户端证书发送到需要它的网络服务器。
如果我从命令行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
有人知道如何使这项工作吗?
答案 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。