【问题标题】:Unable to use libcurl to access a site requiring client authentication无法使用 libcurl 访问需要客户端身份验证的站点
【发布时间】:2011-09-01 17:31:22
【问题描述】:

我正在使用以下片段来设置证书和密钥以进行客户端身份验证。

  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 中遇到了同样的结果。我将客户端证书和密钥连接到一个文件中并尝试如下: curl --cert concatenatedCert.pem --cert-type PEM --cacert cabundle.crt inaveo:8775/DataIntegrationService/WebService/WS_test 输入 PEM 密码:curl: (58) 无法设置私钥文件:'concatenatedCert.pem' 类型 PEM

标签: authentication curl client


【解决方案1】:

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

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

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

另外请注意,在我的情况下,我没有收到提示输入密码并且正在获取

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

密码提示前

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,我发现问题与证书和私钥文件的文件权限有关。运行 PHP 的进程没有读取这些文件的权限。

    您可以尝试的一件事(这有助于我弄清楚这一点)是运行以下代码:

    $result=openssl_get_privatekey('file://path/to/private/key.pem','password');
    

    并检查返回值是否为假且没有错误。我得到了:

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

    【讨论】:

      【解决方案3】:

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

      实际上,我通过确保密钥文件的路径正确来解决问题。这就是为什么 openssl 提示具有误导性,尽管帮助我检查我的 PEM 文件是否正常:

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

      顺便说一句:

      curl_easy_setopt(curl,CURLOPT_SSLCERTPASSWD,"changeit");
      curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");
      curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,"PEM");
      

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

      【讨论】:

        猜你喜欢
        • 2018-06-20
        • 2015-05-14
        • 2019-04-25
        • 2016-08-29
        • 2015-11-22
        • 1970-01-01
        • 1970-01-01
        • 2021-03-03
        • 1970-01-01
        相关资源
        最近更新 更多