我是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]
但是得到了同样的错误。
答案 0 :(得分:114)
我遇到了同样的问题 - 我从我自己的网站上获取了一个页面,该页面是通过HTTPS提供的,但是curl给出了相同的“SSL证书问题”消息。我通过在调用中添加-k
标志来解决这个问题,以允许不安全的连接。
curl -k https://whatever.com/script.php
编辑:我发现了问题的根源。我使用的是SSL证书(来自StartSSL,但我认为这并不重要)并且没有正确设置中间证书。如果你遇到与上述用户1270392相同的问题,那么test your SSL cert可能是一个好主意,并且在使用curl -k
修复之前解决它的任何问题。
答案 1 :(得分:32)
那是我的日常剧本:
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
答案 2 :(得分:25)
您需要提供整个证书链以进行卷曲,因为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
答案 3 :(得分:15)
使用--cacert
指定.crt
文件。
例如ca-root-nss.crt
。
答案 4 :(得分:7)
我实际上遇到了这种问题,我通过以下步骤解决了这个问题:
从此处获取根CA证书包:https://curl.haxx.se/ca/cacert.pem并将其保存在本地
查找php.ini
文件
将curl.cainfo
设置为证书的路径。所以它会像:
curl.cainfo = /path/of/the/keys/cacert.pem
答案 5 :(得分:2)
Here you could find the CA certs with instructions to download and convert Mozilla CA certs。
获得ca-bundle.crt
或cacert.pem
后,您只需使用:
curl.exe --cacert cacert.pem https://www.google.com
或
curl.exe --cacert ca-bundle.crt https://www.google.com
答案 6 :(得分:1)
/etc/ssl/certs/ca-certificates.crt
root用户可以这样做:
echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini
然后重新启动网络服务器。
答案 7 :(得分:1)
你可以用这个
curl_setopt($curl->curl, CURLOPT_SSL_VERIFYPEER, false);
答案 8 :(得分:0)
对我来说,我只是想测试一个具有自动http-&gt; 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>
答案 9 :(得分:0)
您需要证书链而不是单个证书。 使用 Firefox 很容易获得:
connection not secure
、more information
。在 security
标签下,选择 view certificate
,滚动到最后。在 download
旁边,选择 PEM(chain) 以下载证书链。现在您将证书链作为一个文件,您可以在 --cacert
标志后的 curl 请求中使用该文件:
curl --cacert downloaded.pem -X POST https://the-url-to-access
答案 10 :(得分:-3)
对于现代版本的curl,您可以使用--resolve或--connect-to(比7.49版新的curl)来覆盖要连接的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'