https ( SSL ) 的 curl 命令

Posted

技术标签:

【中文标题】https ( SSL ) 的 curl 命令【英文标题】:Curl command for https ( SSL ) 【发布时间】:2015-05-09 17:26:08 【问题描述】:

我正在尝试运行以下 CURL 命令,但出现 SSL 证书错误:

curl https://example.com:8443/cli/agentCLI -u username:password

错误:

curl: (60) SSL 证书问题,验证 CA 证书是否正常。细节: 错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败 更多细节在这里:http://curl.haxx.se/docs/sslcerts.html

curl 默认执行 SSL 证书验证,使用“bundle” 证书颁发机构 (CA) 公钥(CA 证书)。默认 捆绑包被命名为 curl-ca-bundle.crt;您可以指定一个备用文件 使用 --cacert 选项。 如果此 HTTPS 服务器使用由 CA 签名的证书 捆绑包,证书验证可能由于以下原因而失败 证书有问题(它可能已过期,或者名称可能 与 URL 中的域名不匹配)。 如果您想关闭 curl 对证书的验证,请使用 -k(或 --insecure)选项。

如何解决此问题以允许 SSL URL?

【问题讨论】:

另见Use self signed certificate with cURL? 【参考方案1】:

如果您在服务器上使用自签名证书,则可以使用:

curl -k https://example.com:8443/cli/agentCLI -u username:password

但请注意,这并不比使用非 SSL 连接到服务器更好,因为您的通信将不再安全,从而导致各种中间人攻击。

虽然我给你的建议是从服务器下载.pem

通常在 /etc/ssl/ if you have access to the server 中找到, 或者您可以下载,

使用:

echo "HEAD / HTTP/1.0\n Host: example.com\n\n EOT\n" | openssl s_client -prexit -connect example.com:8443 > cert.pem

到您的计算机,只保留文件中BEGIN CERTIFICATEEND CERTIFICATE 之间的部分(包括BEGIN/END 行)并将其作为参数提供给--cacert 选项,您也可以下载它。然后,您将在每次连接时验证您的服务器!

curl --cacert cert.pem https://example.com:8443/cli/agentCLI -u username:password

在我自己的自签名服务器上测试,它工作正常:

% openssl s_client -showcerts -connect example.com:443 </dev/null 2>/dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' | grep -m1 -B-1 -- '-----END CERTIFICATE-----'  > cert.pem
% curl --cacert cert.pem https://example.com

对于一个应该工作的例子:

% openssl s_client -showcerts -connect git.cryptolib.org:443 </dev/null 2>/dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' | grep -m1 -B-1 -- '-----END CERTIFICATE-----'  > cert.pem
% curl --cacert cert.pem https://git.cryptolib.org
curl: (51) SSL: certificate verification failed (result: 5)

但遗憾的是它不是。

我也尝试过,建议here:

% openssl x509 -inform PEM -in cert.pem -text -out certdata.pem
% curl --cacert certdata.pem https://git.cryptolib.org

哪个不起作用,因为我用于测试的那个站点 (git.cryptolib.org) 不是自签名的,而是来自 CACert 链,可以通过使用 CACert 根证书来解决,遵循这个FAQ.


一些要挖掘的资源:

http://curl.haxx.se/docs/sslcerts.html http://curl.haxx.se/mail/archive-2012-01/0049.html https://turboflash.wordpress.com/2009/06/23/curl-adding-installing-trusting-new-self-signed-certificate/ http://curl.haxx.se/docs/caextract.html curl self-signed certificate web service over SSL

但目前还没有明确的答案:-s

【讨论】:

感谢 Zmo..我通过运行命令 echo "HEAD / HTTP/1.0\n Host: example.com\n\n EOT\n" 下载了 .pem | openssl s_client -prexit -connect example.com:8443 > cert.pem。但是当我运行你在这里给出的第二个命令时,我得到了同样的错误 嗨 zmo ..下载 cret.pem 后,我运行 curl -k example.com:8443/cli/agentCLI -u user:pass .. 现在我得到了输出..谢谢.. 但我得到了不可读的输出.. .你能告诉我我将如何获得像行这样的输出.. curl -k 是我的第一个答案,它为您提供了与服务器的不安全 https 连接。它使它工作,但它没有使它经过身份验证。 如果您的输出不可读,则说明您的 URL 上的内容不是全文 HTML,而是其他内容。调试你的服务器代码! curl -k 不是问题的答案,因为它基本上通过允许不安全的连接使其成为 http 而不是 https。

以上是关于https ( SSL ) 的 curl 命令的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 cURL SSL 证书验证 [重复]

如何让 Leopard 从命令行使用 ssl

支持 GMail TLS/STARTTLS 与 SSL 的 Curl SMTP 命令行参数是啥

linux安装curl命令

Mac 下安装 HomeBrew;RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54

windows curl工具怎么用