Curl命令用于https(SSL)

15

我正在尝试运行以下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默认使用证书颁发机构(CA)公钥(CA证书)的“捆绑包”执行SSL证书验证。 默认的捆绑包名为curl-ca-bundle.crt;您可以使用--cacert选项指定其他文件。 如果此HTTPS服务器使用由捆绑包中表示的CA签名的证书,则证书验证可能失败,原因是证书存在问题(可能已过期,或名称与URL中的域名不匹配)。 如果您想关闭curl对证书的验证,请使用-k(或--insecure)选项。

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


1个回答

25

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

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

但请注意,这样做与使用非SSL连接到服务器没有什么区别,因为您的通信将不再安全,从而启用各种中间人攻击。

我给您的建议是从服务器下载.pem文件:

  • 如果您可以访问服务器,则通常可以在/etc/ssl/找到该文件,
  • 或者您可以下载该文件,

使用:

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)

但可悲的是,它不起作用。

我也尝试按照这里的建议进行操作:

% 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操作。


一些挖掘资源:

但到目前为止还没有确定性的答案 :-s


谢谢Zmo。我通过运行命令echo "HEAD / HTTP/1.0\n Host: example.com\n\n EOT\n" | openssl s_client -prexit -connect example.com:8443 > cert.pem下载了.pem文件。但当我运行你在这里给出的第二个命令时,我仍然得到相同的错误。 - Kalaiyarasan
嗨zmo,我下载了cret.pem后,运行了curl -k https://example.com:8443/cli/agentCLI -u user:pass。现在我得到了输出..谢谢..但是我得到了无法阅读的输出...你能告诉我如何获得像行一样的输出吗? - Kalaiyarasan
“curl -k” 是我的第一个答案,它会给你提供不安全的 HTTPS 连接到服务器。它可以让它工作,但它并没有进行身份验证。 - zmo
如果你的输出无法读取,那么问题可能出在你的URL上,并不是完整的HTML文本。调试你的服务器代码吧! - zmo
1
curl -k不是问题的答案,因为它基本上使其成为http而不是https,从而允许不安全的连接。 - Steven2163712
这并不完全正确,一切取决于您的威胁模型。使用curl -k在https URL上通信仍然是加密的,但如果证书被中间路由器接管并替换为新证书,则容易受到中间人攻击。因此,即使不是完全安全的HTTPS连接,它仍比HTTP更好。因此,有两个选择:证书固定(如我在答案中建议的)或使用letsencrypt。 - zmo

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