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

Getting (58) unable to use client certificate (no key found or wrong pass phrase?) from curl

我正在尝试对需要客户端证书的第三方 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 和 运行 "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) 无法使用客户端证书(未找到密钥或密码短语错误?)”。密钥没有密码。所有 cert/key 个文件都有 777 个权限。

我过去没有太多的证书工作,我觉得我错过了一些东西,尤其是因为我似乎只有一个证书。其他公司发给我的证书是 cacert 还是我的客户证书?我是否将私钥连接到错误的证书?

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

将密码短语添加到我的私钥解决了我的问题。

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

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

如果您不能使用本地生成的证书并且来自这里 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() failed: Problem with the local SSL certificate").

正确的方法可能应该像下一个link中描述的那样(用于生成本地自签名的三个文件,用于客户端身份验证的开发目的): 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";