Curl 不考虑给定的证书(使用 --cert 选项)

Curl does not take into consideration the given certificate(using --cert option)

我正在尝试使用 curl 调用 URL,我使用了以下命令:

curl https://testenvironment/login --cert Qa1Certificate.pem

我得到的结果是:

curl: (60) Peer certificate cannot be authenticated with known CA certificates
 More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

Qa1Certificate.pem放在当前目录下,我相信没有考虑到,因为当我用运行同样的命令一个不存在的文件名:

curl https://testenvironment/login --cert ThisFileDoesNotExist.pem

我得到了相同的结果。

我知道我可以使用 -k 或 --insecure 选项(或其他禁用 curl 证书验证的方法)获得我需要的东西,但我 想了解如何使用证书才能成功执行 GET 到我的测试环境。

测试环境使用我使用openSSL获得的自签名证书。

TLDR:它是 --cacert

来自手册页,它应该在您的系统上 or on the web:

-E, --cert <certificate[:password]>

(TLS) Tells curl to use the specified client certificate file when getting a file with HTTPS, FTPS or another SSL-based protocol. [snip rest]

注意单词 'client certificate'。 --cert 用于指定证书和可能的密钥 以验证客户端 ,而不是验证服务器。 现在考虑手册页上的另一个条目:

--cacert

(TLS) Tells curl to use the specified certificate file to verify the peer. The file may contain multiple CA certificates. The certificate(s) must be in PEM format. Normally curl is built to use a default file for this, so this option is typically used to alter that default file.

这是指定一个或多个证书以验证(特别是锚定)服务器证书的选项。由于您的服务器证书是自签名的,因此证书是它自己的 anchor/root 并且实际上是 CA 证书,即使服务器实际上不是 CA。

这就是为什么您发布的错误消息包含以下字样 you can specify an alternate file using the --cacert option. 它没有说 --cert.

是否读取 client 证书(和密钥)取决于您 运行 的 curl 的特定构建使用的中间件。 IME 如果使用 OpenSSL 构建,如果您使用不存在的文件名指定 --cert,它确实会给出错误,但是使用 NSS(在 Ubuntu 14.04LTS)构建的版本仅在服务器请求客户端身份验证时才会给出错误,大多数服务器没有。