curl: (58) 无法加载客户端密钥 -8178。

27

我在使用curl命令时遇到了SSL问题,我想要使用我的SSL客户端证书和私钥访问一个URL。

这是我的命令:

$ curl -k -v "https://myurl.com/" --cert ./certificate.pem --key ./private.key

* About to connect() to xx.xx.xx.xx port 23444 (#0)
*   Trying xx.xx.xx.xx... connected
* Connected to xx.xx.xx.xx (xx.xx.xx.xx) port 23444 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* warning: ignoring value of ssl.verifyhost
* Unable to load client key -8178.
* NSS error -8178
* Closing connection #0
curl: (58) Unable to load client key -8178.

这个密钥受到密码保护,但curl没有要求我输入密码,这很奇怪。即使我使用--pass传递密码,我仍然会收到相同的错误信息。

似乎参数--key没有被考虑在内,因为如果我将其替换为foo.key(该文件在我的文件系统中不存在),我仍然会收到相同的错误信息。

然而,如果我使用:

$ wget --certificate=./certificate.pem --private-key=private.key "https://myurl.com/" --no-check-certificate

我能够访问我的URL。

你有任何想法吗?


权限问题出在哪里? - hzrari
一个解决方法是将您的证书导入NSS数据库,就像这里所示:https://dev59.com/s2Uo5IYBdhLWcg3wxB3T 在你之前,我也搜索了其他的解决方案,但没有找到。如果您找到了,请发布它。 - thibon
2个回答

31

我经历过相同的问题,最终找到了解决方案,也许可以帮助你。

失败是由于私钥采用PKCS#8格式:

  • PKCS#8私钥以 -----BEGIN ENCRYPTED PRIVATE KEY-----标题
    或者
    -----BEGIN PRIVATE KEY-----标题

    使用此密钥, curl + openssl 将起作用,但 curl +nss +libnsspem.so 不会起作用。

  • 具有以
    -----BEGIN RSA PRIVATE KEY-----标题开始的RSA私钥

    curl + opensslcurl + nss + libnsspem.so都将工作。

因此,请使用此命令

openssl pkcs8 -in path/to/your/pkcs8/key -out path/to/rsa/key

将PKCS#8密钥转换为传统的RSA密钥。


谢谢您的回答。理论上这可能行得通,但在我的使用场景中,我不被允许为数据库中的每个密钥生成一个新密钥,即使是暂时的等等。最终我不得不使用wget代替...我只是发布它以了解答案并与面临相同问题的人分享;-) - hzrari
1
为了完整性,curl 的正确参数是:--cert ./certificate.pem --key ./newkey.pem,其中 newkey.pem 是使用 openssl 创建的新 RSA 密钥的副本。 - David Balažic
1
我有同样的问题,但我不想存储未加密的密钥文件。 CURL是否有一种方法可以提示我输入密码并使用加密的密钥? - Brad
4
@Brad 只需给 RSA 私钥添加一个密码短语:openssl rsa -des3 -in your.key -out your.encrypted.key-des3 意味着加密算法,你也可以使用其他算法,如 aes128、aes192。 - jfly
1
显然这是一个已知的 bug,于 2016 年报告。nss-pem 不支持使用除 des 以外的加密的密钥。-- https://bugzilla.redhat.com/show_bug.cgi?id=1369251 - Ján Lalinský
显示剩余3条评论

4

如果您的证书有密码,请在证书名称后添加密码:

curl -k -v "https://myurl.com/" --cert ./certificate.pem:passphrase --key ./private.key

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接