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

Authentication 无法使用libcurl访问需要客户端身份验证的站点,authentication,curl,client,Authentication,Curl,Client,我使用下面的截图来设置客户端身份验证的证书和密钥 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_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");
证书没有密码,我不知道为什么SSLCERTPASSWD选项存在,我只是提供了一个伪值。 当我在Linux上运行这个程序时,我得到一个错误代码58和一条错误消息 无法设置私钥文件:“privateKey.pem”类型pem

在Windows上,无论我得到什么 无法使用客户端证书(未找到密钥或密码短语错误?)

这似乎表明证书和密钥不匹配,但我不知道如何匹配。我使用openssl命令从p12文件中提取了证书和密钥。 我用来提取密钥的命令是

openssl.exe pkcs12 -in client.p12 -nocerts -out privateKey.pem
用于提取证书的命令是

openssl.exe pkcs12 -in client.p12 -nokeys -out clientCert.pem
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

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

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

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

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

还要注意的是,在我的例子中,没有提示我输入密码,而是得到了

curl: (58) unable to set private key file: 'alice.pem' type PEM

在密码提示出现之前,我遇到了类似的问题,我发现问题与证书和私钥文件的文件权限有关。运行PHP的进程没有对这些文件的读取权限

您可以尝试(这有助于我理解这一点)运行以下代码:

$result=openssl_get_privatekey('file://path/to/private/key.pem','password');
并检查返回值是否为false,是否没有错误。我得到了:

file_get_contents(/path/to/private/key.pem): failed to open stream: Permission denied

感谢Hugh提供的线程和raugfer提供的openssl提示。后者:既有帮助又有误导性

实际上,我通过确保密钥文件的路径正确解决了这个问题。以下是openssl提示具有误导性的原因,dispite帮助我检查PEM文件是否正常:

cURL需要完整的路径,但没有“file://”前缀。虽然fopen对相对路径很满意,但cURL却不是。因此,我打开密钥文件的所有测试都成功了,而cURL没有成功

顺便说一句:


不需要,因为密码仅用于解密私钥,PEM是默认值。

我在命令行curl中面临相同的结果。我将客户端证书和密钥连接到一个文件中,并尝试如下操作:curl--cert concatenatedCert.pem--cert type pem--cacert cabundle.crt输入pem密码短语:curl:(58)无法设置私钥文件:“concatenatedCert.pem”type pem
curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"changeit");
curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");
curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM");