当前位置: 首页 > 知识库问答 >
问题:

用于https(SSL)的Curl命令

陆正德
2023-03-14

我正在尝试运行以下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(或--insec)选项。

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

共有1个答案

强安和
2023-03-14

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

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

对于您的计算机,只保留文件中开始证书和结束证书之间的部分(包括开始/结束行),并将其作为参数提供给--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根证书来解决这个问题,如下常见问题解答。

一些要挖掘的资源:

  • 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
  • 通过SSL卷曲自签名证书Web服务

但到目前为止没有明确的答案:-s

 类似资料:
  • 我不熟悉Curl和Cacerts的世界,在连接到服务器时遇到了一个问题。基本上,我需要测试从一台机器到另一台机器的https连接。我有一个URL,我需要从机器a(linux机器)连接到它。我在命令提示符下尝试了这个方法 并得到以下结果: 在浏览互联网上的一些文章时,我这样做了: 并得到了一些响应,包括服务器证书(在)。 接下来我该怎么办。我想,我只需将文本复制粘贴到

  • 我有一个终端卷曲命令可以正常工作 curl-H“内容类型:application/json”--cert cert.p12:myPassword-X POST-d'myJsonData'https://api-applecareconnect-ept.apple.com/enroll-service/1.0/bulk-enroll-devices 我已将命令转换为如下所示: 但我收到错误“访问被拒

  • 问题内容: 我发现此功能确实出色(IMHO) 我唯一的问题是它不适用于https://。Anny的想法,我需要做些什么才能使https工作?谢谢! 问题答案: 快速修复,在您的选项中添加: 现在,您不知道您实际上要连接到哪个主机,因为cURL不会以任何方式验证证书。 或只是将其添加到当前函数中:

  • 我试图使用PowerShell从https网站抓取html内容。 不幸的是,该站点只例外一组有限的SSL/TLS密码套件,不支持Powershell可用的套件。 如果尝试使用Invoke-WebRequest cmdlet,我会收到以下错误消息: 调用-网络请求:请求被中止:无法创建SSL/TLS安全通道。 问题: 是否有办法指定PowerShell使用的客户端SSL/TLS密码套件? 还有其他c

  • 我所拥有的是一个在Dropwizard之上实现的服务器,它需要接受传入的HTTPS连接,并使用附加的证书来唯一标识客户端。我目前在开发过程中使用所有自签名证书。服务器证书对是使用链根对->中间对->服务器对创建的。服务器的P12是使用中间证书和服务器证书加上服务器私钥的串联来创建的。然后它被添加到一个空的JKS中,并成为服务器的密钥库。 我分别创建了两个客户端证书,一个使用相同的中间对作为基础,另

  • 我在独立配置中使用Keycloak-8.0.1。我正在尝试为运行在我的测试机器(A.B.C.D)上的Keycloak服务器启用SSL/HTTPS,将从机器(X.Y.Z.P)请求令牌请求。 (生成的令牌会有任何CORS/CSRF问题吗?看起来是的?SSL上的Keycloak会帮助解决这个问题吗?)不过,我需要启用SSL。 于是就开始了https://www.keycloak.org/docs/lat