175

我是 Curl 和 Cacerts 世界的新手,在连接服务器时遇到问题。基本上,我需要通过 https 测试从一台机器到另一台机器的连接性。我有一个需要从机器 A(Linux 机器)连接到的 URL 我在命令提示符下尝试了这个

cmd> curl https://[my domain or IP address]

并得到以下信息:

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

在通过互联网浏览一些文章时,我这样做了:

openssl s_client -connect <domain name or Ip address>:443

并得到了一些响应,包括服务器证书(内部-----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----)。

从这里我下一步该怎么做。我想,我将不得不复制粘贴其中的文本 BEGIN CERTIFICATE & END CERTIFICATE并将其保存在文件中。但是,它应该是什么类型的文件?.pem, .crt?.. 那之后我该怎么办?

我试过这个 - 复制里面的文本BEGIN CERTIFICATE & END CERTIFICATE并将其保存在一个.crt文件中 - 将其命名为my-ca.crt(也通过将其命名为my-ca.pem文件来尝试相同的事情)然后这样做:

cmd>curl --cacert my-ca.crt https://[my domain or IP address]

但是得到了同样的错误。

4

12 回答 12

183

我遇到了同样的问题 - 我正在从我自己的站点获取一个页面,该站点通过 HTTPS 提供,但 curl 给出了相同的“SSL 证书问题”消息。我通过-k在调用中添加一个标志以允许不安全的连接来解决它。

curl -k https://whatever.com/script.php

编辑:我发现了问题的根源。我使用的是 SSL 证书(来自 StartSSL,但我认为这并不重要)并且没有正确设置中间证书。如果您遇到与上述 user1270392 相同的问题,那么在进行修复之前测试您的 SSL 证书并修复任何问题可能是个好主意curl -k

于 2014-02-10T17:57:43.330 回答
66

基本证书信息

这是我的日常脚本:

curl --insecure -vvI https://www.example.com 2>&1 | awk 'BEGIN { cert=0 } /^\* SSL connection/ { cert=1 } /^\*/ { if (cert) print }'

输出:

* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: C=US; ST=California; L=Los Angeles; O=Verizon Digital Media Services, Inc.; CN=www.example.org
*  start date: Dec 10 00:00:00 2021 GMT
*  expire date: Dec  9 23:59:59 2022 GMT
*  issuer: C=US; O=DigiCert Inc; CN=DigiCert TLS RSA SHA256 2020 CA1
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x5588e1f5ae30)
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
* Connection #0 to host www.example.com left intact

完整的证书信息

openssl s_client -connect www.example.com:443 </dev/null 2>/dev/null | openssl x509 -inform pem -text
于 2016-01-15T13:22:05.213 回答
41

您需要提供整个证书链来 curl,因为 curl 不再附带任何 CA 证书。由于 cacert 选项只能使用一个文件,因此您需要将完整的链信息连接到 1 个文件中

将证书链(例如从您的浏览器中)复制到 DER 编码的二进制 x.509(.cer) 中。为每个证书执行此操作。

将证书转换为 PEM,并将它们连接到 1 个文件中。

openssl x509 -inform DES -in file1.cer -out file1.pem -text
openssl x509 -inform DES -in file2.cer -out file2.pem -text
openssl x509 -inform DES -in file3.cer -out file3.pem -text

cat *.pem > certRepo

curl --cacert certRepo -u user:passwd -X GET -H 'Content-Type: application/json' "https//somesecureserver.com/rest/field"

我在这里写了一篇关于如何做到这一点的博客:http: //javamemento.blogspot.no/2015/10/using-curl-with-ssl-cert-chain.html

于 2015-10-21T09:09:29.383 回答
25

用于--cacert指定.crt文件。 ca-root-nss.crt例如。

于 2013-04-30T10:03:47.180 回答
7

我实际上遇到了这种问题,我通过以下步骤解决了它:

  1. 从这里获取根 CA 证书包:https ://curl.haxx.se/ca/cacert.pem并将其保存在本地

  2. 查找php.ini文件

  3. 将 设置curl.cainfo为证书的路径。所以它会是这样的:

curl.cainfo = /path/of/the/keys/cacert.pem

于 2016-02-17T09:22:46.833 回答
5

在这里您可以找到 CA 证书以及下载和转换 Mozilla CA 证书的说明。一旦你得到ca-bundle.crtcacert.pem你只是使用:

curl.exe --cacert cacert.pem https://www.google.com

或者

curl.exe --cacert ca-bundle.crt https://www.google.com
于 2014-12-08T17:31:21.990 回答
2

诊断出问题后,我能够使用现有的系统默认 CA 文件,在 debian6 上是:

/etc/ssl/certs/ca-certificates.crt

作为 root 可以这样做:

echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini

然后重新启动网络服务器。

于 2016-12-07T22:18:36.387 回答
1

您需要证书链而不是单个证书。使用 Firefox 很容易获得它:

  1. 在 Firefox 中打开网址。
  2. 单击 URL 左侧地址框上的安全图标。
  3. 点击connection not secure, more information。在security选项卡下,选择view certificate,向末尾滚动。在 旁边download,选择PEM(chain)以下载证书链。

现在,您将证书链作为一个文件,您可以在--cacert标志之后的 curl 请求中使用它:
curl --cacert downloaded.pem -X POST https://the-url-to-access

于 2021-06-30T13:23:25.657 回答
1

你可以用这个

curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);

于 2018-03-13T09:11:29.137 回答
0

有什么问题wget

抱怨标准将其抛在脑后,这不是一个人。

于 2021-09-07T02:56:37.967 回答
0

对我来说,我只是想测试一个具有自动 http->https 重定向的网站。我想我已经安装了一些证书,因此仅此一项就可以在 Ubuntu 16.04 上运行curl 7.47.0 (x86_64-pc-linux-gnu) libcurl/7.47.0 GnuTLS/3.4.10 zlib/1.2.8 libidn/1.32 librtmp/2.3

curl --proto-default https <target>

于 2018-01-08T19:01:32.740 回答
-4

使用现代版本的 curl,您可以使用 --resolve 或 --connect-to (curl 比版本 7.49 更新)简单地覆盖要连接的 IP 地址。这甚至适用于 SSL/SNI。所有详细信息都在手册页中。

例如,要覆盖 DNS 并使用特定 IP 地址通过 ssl 连接到 www.example.com:(这也将覆盖 ipv6)

curl --resolve www.example.com:443:192.168.42.2 https://www.example.com/

另一个示例,连接到端口 8080 上名为 backend1 的特定后端服务器

curl --connect-to www.example.com:80:backend1.example.com:8080 http://www.example.com/

如果服务器需要正确回答,请记住添加主机标头:

-H 'Host:www.example.com' 
于 2018-11-13T09:02:22.967 回答