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

Ssl 从curl获取(58)无法使用客户端证书(未找到密钥或密码短语错误?),ssl,curl,ssl-certificate,Ssl,Curl,Ssl Certificate,我正在尝试对需要客户端证书的第三方API进行测试调用。我使用openssl的以下命令生成了一个新的证书: req -new -newkey rsa:2048 -nodes -out mycsr.csr -keyout mykey.key 然后我把csr发给他们,他们把我送回mycert.crt。我将证书和密钥连接在一起: cat mycert.crt mykey.key > mycertandkey.pem 最后,我将mycert.crt添加到ca-certificates文件夹和ca

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

req -new -newkey rsa:2048 -nodes -out mycsr.csr -keyout mykey.key
然后我把csr发给他们,他们把我送回mycert.crt。我将证书和密钥连接在一起:

cat mycert.crt mykey.key > mycertandkey.pem
最后,我将mycert.crt添加到ca-certificates文件夹和ca-certificates.conf中,并运行“更新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:(58)无法使用客户端证书(找不到密钥或密码短语错误?”。密钥没有密码短语。所有证书/密钥文件都有777个权限

我在过去很少使用证书,我觉得我错过了一些东西,特别是因为我似乎只有一个证书。是另一家公司发给我的证书还是我的客户证书?我是否将私钥连接到错误的证书


我在网上找到了很多关于这方面的零碎信息,但如果有人知道这方面的好教程,我也非常感激。

在我的私钥中添加密码短语解决了我的问题

我使用以下命令添加密码短语:

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

如果您不能使用本地生成的证书并且从

如果生成的用于开发的自签名本地证书不正确,则可能会出现这种情况 (首先我试着用一个命令 openssl req-x509-config./openssl-ca.cnf-newkey rsa:4096-sha256-nodes-out cacert.pem-outform pem ,但在出现错误“curl\u easy\u perform()失败:本地SSL证书出现问题”时,它不起作用

正确的方法可能与下一个链接中所述的方法类似(用于生成本地自签名的三个文件,用于开发人员使用客户端身份验证):

(然后我测试了我可以将结果证书与libcurl一起使用,请参见示例simplessl.c,并在这个simplessl.c示例中将文件名更新为如下内容:

static const char *pCertFile = "localdomain.crt";
static const char *pCACertFile = "cacert.pem";
pKeyName  = "localdomain.insecure.key";
static const char *pCertFile = "localdomain.crt";
static const char *pCACertFile = "cacert.pem";
pKeyName  = "localdomain.insecure.key";