无法设置私钥文件:“./cert.pem”类型 PEM

Posted

技术标签:

【中文标题】无法设置私钥文件:“./cert.pem”类型 PEM【英文标题】:unable to set private key file: './cert.pem' type PEM 【发布时间】:2013-05-13 13:06:38 【问题描述】:

我正在使用 curl 使用公共证书文件从 https 站点下载数据。

系统信息:

操作系统: fedora 14 curl: curl 7.30.0 openssl: OpenSSL 1.0.0a-fips

命令是,

curl -v "https://<ip:<port>" --cert "./cert.pem" --cacert "./cacert.pem" --cert-type PEM
* About to connect() to kng.com port 443 (#0)
*   Trying 11.19.37.123...
* Adding handle: conn: 0x8189e68
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x8189e68) send_pipe: 1, recv_pipe: 0
* Connected to fkng.com (11.19.37.123) port 443 (#0)
* unable to set private key file: './cert.pem' type PEM
* Closing connection 0
curl: (58) unable to set private key file: './cert.pem' type PEM

我已授予.pem 文件的所有权限,但 curl 仍然抛出错误。

【问题讨论】:

【参考方案1】:

在您使用的选项上阅读 cURL documentation 后,看起来证书的私钥不在同一个文件中。如果它在不同的文件中,您需要使用 --key 文件提及它并提供密码。

因此,请确保 cert.pem 具有私钥(连同证书)或使用 --key 选项提供它。

此外,本文档提到 请注意,此选项假定一个“证书”文件是私钥和私人证书连接!

它们是如何连接的?这很容易。将它们一个接一个地放在同一个文件中。

您可以在此here 上获得更多帮助。

我相信这可能会对你有所帮助。

【讨论】:

感谢您提供宝贵的信息。我仍然不明白的一件事是如何从公共证书中检索私钥。我可以使用此命令获取公钥“openssl x509 公钥证书不包含私钥。私钥由所有者安全保管。如果您没有私钥,则您不是证书的所有者。 实际上这个公共证书是由另一台服务器提供的,用于从他们的 https url 下载数据。是否可以使用 https url 的公共证书下载数据。如果你给我你的 HTTPS每次查看 https 页面内容所需的凭据是什么。 此证书是否颁发给您的证书签名请求 (CSR)?这个证书的用途是什么? 如果连接请求证书,那么它需要私钥对数据进行签名,服务器通过该私钥可以验证证书属于客户端。如果firefox能够使用证书,它必须有私钥。您可以导出私钥并使用它。【参考方案2】:

我在使用 Open SSL 时遇到了这个问题,解决方案是将证书拆分为 3 个文件,并使用它们全部使用 Curl 进行调用:

openssl pkcs12 -in mycert.p12 -out ca.pem -cacerts -nokeys
openssl pkcs12 -in mycert.p12 -out client.pem -clcerts -nokeys 
openssl pkcs12 -in mycert.p12 -out key.pem -nocerts

curl --insecure --key key.pem --cacert ca.pem --cert client.pem:KeyChoosenByMeWhenIrunOpenSSL https://thesite

【讨论】:

嗯。确定它在你设置密码的client.pem上? 老兄,你使用了 --insecure 这意味着你实际上并没有使用 .pem :|【参考方案3】:

我遇到了同样的问题,最终我通过关注 Petter Ivarrson 的 answer 找到了一个无需拆分文件即可工作的解决方案

我的问题是在将 .p12 证书转换为 .pem 时。我用过:

openssl pkcs12 -in cert.p12 -out cert.pem

这会将所有证书(CA + CLIENT)与私钥一起转换并导出到一个文件中。

问题是当我尝试通过运行验证证书和密钥的哈希是否匹配时:

// Get certificate HASH
openssl x509 -noout -modulus -in cert.pem | openssl md5

// Get private key HASH
openssl rsa -noout -modulus -in cert.pem | openssl md5

这显示了不同的哈希值,这就是 CURL 失败的原因。 见这里:https://michaelheap.com/curl-58-unable-to-set-private-key-file-server-key-type-pem/

我猜这是因为所有证书都在一个文件中(CA + CLIENT),而 CURL 采用 CA 证书而不是 CLIENT 证书。因为 CA 在列表中排名第一。

所以解决方案是只导出 CLIENT 证书和私钥:

openssl pkcs12 -in cert.p12 -out cert.pem -clcerts
``

Now when I re-run the verification:
```sh
openssl x509 -noout -modulus -in cert.pem | openssl md5
openssl rsa -noout -modulus -in cert.pem | openssl md5

哈希匹配!!!

所以我可以通过运行发出 curl 请求

curl -ivk --cert ./cert.pem:KeyChoosenByMeWhenIrunOpenSSL https://thesite.com

没有问题!!! ?

话虽如此...我认为最好的解决方案是将证书拆分为单独的文件并像 Petter Ivarsson 所写的那样单独使用它们:

curl --insecure --key key.pem --cacert ca.pem --cert client.pem:KeyChoosenByMeWhenIrunOpenSSL https://thesite.com

【讨论】:

【参考方案4】:

我有类似的情况,但是我在不同的文件中使用了密钥和证书。

在我的情况下,您可以通过比较哈希值来检查密钥和锁的匹配(请参阅https://michaelheap.com/curl-58-unable-to-set-private-key-file-server-key-type-pem/)。这有助于我发现不一致之处。

【讨论】:

【参考方案5】:

我不确定这是否对任何人有帮助,但我遇到了这个错误(虽然我使用 php 而不是命令行来创建它)并修复它我必须确保没有旧的 .key 或 .pem 文件在我正在查看的目录中。通过删除它们并使用身份验证制作新文件,它可以完美运行!

【讨论】:

以上是关于无法设置私钥文件:“./cert.pem”类型 PEM的主要内容,如果未能解决你的问题,请参考以下文章

Web配置简单记录(多更新)

mitmproxy-ca-cert.pem手机证书文件安装(一直安装不上,折磨我了两天!)

使用 PHP 在 Curl 中将 .PEM 和 .KEY 作为字符串传递

SSL虚拟主机

ESA2GJK1DH1K安全篇: MQTT配置单向SSL

当我尝试将其转换为 cert.pem 和 key.pem 时,我有 p12 证书。 Key.pem 为空