从curl获取(58)无法使用客户端证书(没有找到密钥或密码错误?)

8

我正在尝试对一个需要客户端证书的第三方API进行测试调用。我使用openssl命令生成了一个新的证书:

req -new -newkey rsa:2048 -nodes -out mycsr.csr -keyout mykey.key

我随后将CSR发送给他们,他们回复了我的cert.crt。我将证书和密钥拼接在一起:

cat mycert.crt mykey.key > mycertandkey.pem

最后,我将mycert.crt添加到ca-certificates文件夹和ca-certificates.conf中,并运行“update-ca-certificates --fresh”。

现在,我正在尝试使用以下命令从bash中调用curl:

curl -X GET --cert mycertandkey.pem -H 'Accept-Encoding: gzip,deflate' -H 'Content-Type: application/json' https://api.URL.com

我也尝试过以下方法:
curl -X GET --cert mycertandkey.pem --cacert mycert.crt -H 'Accept-Encoding: gzip,deflate' -H 'Content-Type: application/json' https://api.URL.com

并且:

curl -X GET --cert mycertandkey.pem --cacert mycert.crt --key mykey.key -H 'Accept-Encoding: gzip,deflate' -H 'Content-Type: application/json' https://api.URL.com

我尝试了所有其他的组合方式,但总是遇到错误“curl: (58) unable to use client certificate (no key found or wrong pass phrase?)”。密钥没有密码。所有cert/key文件均为777权限。
过去我没有太多处理证书的经验,感觉可能漏掉了什么,特别是因为我似乎只有一个证书。那个公司发送给我的是cacert还是客户端证书?我是否将私钥连接到了错误的证书上?
我在网上找到了很多关于这个问题的零散信息,但如果有人知道这个主题的好教程,我会非常感激的。
2个回答

9

将私钥加上口令解决了我的问题。

我使用以下命令添加口令:

ssh-keygen -p -f mykey.key

在我能成功运行该命令之前,我需要更改密钥文件的权限。777 权限不够限制性,ssh-keygen 将无法操作它。将权限更改为 600 可以解决此问题。
chmod 600 mykey.key

在添加了口令短语后,我重新创建了.pem文件。现在,我可以使用以下命令成功地进行curl调用:

curl -X GET --cert mycertandkey.pem:mypassphrase -H 'Accept-Encoding: gzip,deflate' -H 'Content-Type: application/json' https://api.URL.com

1
如果您无法使用本地生成的证书,并且从此处进入 https://developer.tizen.org/forums/native-application-development/curl-ssl-problem-local-ssl-certificate ...
可能是因为错误地为开发生成自签名本地证书(首先我尝试了一个命令     openssl req -x509 -config ./openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM ,但它没有工作,然后出现错误“curl_easy_perform()失败:本地SSL证书有问题”)。
正确的方式可能应该像下面的链接描述的那样(用于生成本地自签名、三个文件、用于客户端身份验证的开发目的): https://blog.atulr.com/localhost-https/ (然后我测试了我可以使用libcurl使用结果证书,看看例子simplessl.c,只需更新文件名为这个simplessl.c示例中的某些内容即可:
static const char *pCertFile = "localdomain.crt";
static const char *pCACertFile = "cacert.pem";
pKeyName  = "localdomain.insecure.key";

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