wake-up-neo.com

从命令行使用卷曲进行HTTPS连接

我是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]

但得到了同样的错误。

95
user1270392

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

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

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

114
Dave Child

简单解决方案

这是我的日常脚本:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

输出:

* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*    start date: 2016-01-07 11:34:33 GMT
*    expire date: 2016-04-06 00:00:00 GMT
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to Host www.google.com left intact
29
Antonio Feitosa

您需要提供整个证书链以进行卷曲,因为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

25
Somaiah Kumbera

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

15
ano

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

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

  2. 找到php.ini文件

  3. curl.cainfo设置为证书的路径。所以它会像:

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

6
geckob

我已经能够使用现有的系统默认CA文件来解决这个问题,在debian6上这是:

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

作为root,可以这样做:

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

然后重新启动Web服务器。

1
Jasen

你可以用它

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

1
Ahmed Ali

在这里,您可以找到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
1
lmiguelmh

对我来说,我只想测试一个具有自动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>

0
SamCyanide