无法使用libcurl访问需要客户端身份验证的站点

Hug*_*ing 5 authentication client curl

我正在使用下面的snipped来设置证书和密钥以进行客户端身份验证.

  curl_easy_setopt(curl,CURLOPT_SSLCERT,"clientCert.pem");
  curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"changeit");
  curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");
  curl_easy_setopt(curl,CURLOPT_SSLKEY,"privateKey.pem");
  curl_easy_setopt(curl,CURLOPT_SSLKEYPASSWD,"changeit");
  curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM");
Run Code Online (Sandbox Code Playgroud)

证书没有密码,我不知道为什么选择SSLCERTPASSWD存在,我只提供了一个虚拟值.当我在Linux上运行程序时,我得到错误代码58和错误消息无法设置私钥文件:'privateKey.pem'类型PEM

但是在Windows上,我无法使用客户端证书(找不到密钥或错误的密码?)

它似乎暗示证书和密钥不匹配但我不知道如何.我使用openssl命令从p12文件中提取了证书和密钥.我用来提取密钥的命令是

openssl.exe pkcs12 -in client.p12 -nocerts -out privateKey.pem
Run Code Online (Sandbox Code Playgroud)

用于提取证书的命令是

openssl.exe pkcs12 -in client.p12 -nokeys -out clientCert.pem
Run Code Online (Sandbox Code Playgroud)

p12文件已成功用于浏览器以访问客户端身份验证URL.在我开枪之前请帮忙.

编辑:以下是私钥和证书相互对应的证明:

[debugbld@nagara ~/curlm]$ openssl x509 -noout -modulus -in clientCert.pem | openssl md5
d7207cf82b771251471672dd54c59927

[debugbld@nagara ~/curlm]$ openssl rsa -noout -modulus -in privateKey.pem | openssl md5
Enter pass phrase for privateKey.pem:
d7207cf82b771251471672dd54c59927
Run Code Online (Sandbox Code Playgroud)

那么为什么它不能工作呢?

xve*_*ges 3

使用命令行curl,我使用也使用openssl从p12文件获取的.pem文件遇到了同样的错误,当在浏览器中导入时,p12也能够正常工作进行客户端身份验证。我想就像你所描述的那样。

我的问题是因为 .pem 文件没有按正确的顺序列出证书而引起的:似乎文件中的每个证书都必须后跟其颁发者证书。我编辑了文件并更改了各部分的顺序,curl 很高兴

作为记录,我的原始 .p12 文件是通过备份 Firefox 的证书获得的。

另请注意,就我而言,我没有收到输入密码的提示,而是得到了

curl: (58) unable to set private key file: 'alice.pem' type PEM
Run Code Online (Sandbox Code Playgroud)

在出现密码提示之前