从命令行使用CURL的https连接
我不熟悉Curl和Cacerts的世界,在连接到服务器时遇到了一个问题。 基本上,我需要测试从一台机器到另一台机器的https连接。 我有一个URL,需要从机器a(linux机器)连接到该URL 我在命令提示符下尝试了这个从命令行使用CURL的https连接,curl,ssl,command-line,https,certificate,Curl,Ssl,Command Line,Https,Certificate,我不熟悉Curl和Cacerts的世界,在连接到服务器时遇到了一个问题。 基本上,我需要测试从一台机器到另一台机器的https连接。 我有一个URL,需要从机器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
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
cmd>curl --cacert my-ca.crt https://[my domain or IP address]
但是得到了相同的错误。使用--cacert
指定.crt
文件。
ca根nss.crt
例如 我也遇到了同样的问题-我从自己的站点获取了一个页面,该页面通过HTTPS提供服务,但curl给出了相同的“SSL证书问题”消息。我通过在调用中添加-k
标志来解决这个问题,以允许不安全的连接
curl -k https://whatever.com/script.php
编辑:我发现了问题的根源。我使用的是SSL证书(来自StartSSL,但我认为这并不重要),并且没有正确设置中间证书。如果您遇到与上面的用户1270392相同的问题,在使用curl-k
修复之前,最好先检查并修复它的任何问题。。
一旦获得ca bundle.crt
或cacert.pem
您只需使用:
curl.exe --cacert cacert.pem https://www.google.com
或
您需要向curl提供整个证书链,因为curl不再附带任何CA证书。由于cacert选项只能使用一个文件,因此需要将完整的链信息合并到一个文件中 将证书链(例如,从浏览器)复制到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"
我在这里写了一篇关于如何做到这一点的博客:Simple solution
这是我的日常脚本:
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
我实际上遇到了这种问题,我通过以下步骤来解决:
php.ini
文件curl.cainfo
设置为证书的路径。因此,它将类似于:curl.cainfo=/path/of/the/keys/cacert.pem
已诊断出问题
我能够使用debian6上现有的系统默认CA文件,这是:
/etc/ssl/certs/ca-certificates.crt
作为root用户,可以这样做:
echo curl.cainfo=/etc/ssl/certs/ca-certificates.crt >> /etc/php5/mods-available/curl.ini
然后重新启动web服务器。对于我来说,我只是想测试一个具有自动http->https重定向的网站。我想我已经安装了一些证书,所以在运行
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的Ubuntu 16.04上,这一点对我来说就足够了
curl——协议默认https
您可以使用
curl\u setopt($curl->curl,CURLOPT\u SSL\u VERIFYPEER,false)代码>使用curl的现代版本,您可以使用--resolve或--connect to(curl比7.49版更新)简单地覆盖要连接的ip地址。这甚至适用于SSL/SNI。所有详细信息都在手册页中
例如,要覆盖DNS并使用特定ip地址通过ssl连接到www.example.com:(这也将覆盖ipv6)
另一个示例是,连接到端口8080上名为backend1的特定后端服务器
curl --connect-to www.example.com:80:backend1.example.com:8080 http://www.example.com/
如果服务器需要主机头才能正确应答,请记住添加主机头:
-H 'Host:www.example.com'
-k标志是一个很好的捷径。为我工作!你能解释一下传递用户名和密码的目的吗?如果我正在编写Java客户端,那么我需要在GET请求的头中传递用户名和密码吗?如果您的https服务器不需要对GET请求进行简单身份验证,则@Shubhi224不需要。我必须使用身份验证,因为这是一个REST调用,需要它。正如在回答中所提到的“您需要向curl提供整个证书链,因为curl不再附带任何CA证书。”不确定您建议的解决方案,但是我只是在寻找类似的信息,我发现这个有用的网站可以将curl与PHP结合使用。你也可以添加--unsecure
,以忽略SSL错误。较新版本的curl(例如7.64)无法识别像RC4-SHA这样的旧密码-使用较旧版本的curl(7.46)帮助我,您每天都允许通过TSL进行不安全的连接…@Brethlosze谢谢您的评论。但事实并非如此。关键是要从各种证书中获取SSL信息。我不明白这是一个怎样的解决方案?这可能会返回一些ssl信息,但您尚未解释这与问题的相关性。@Brethlosze是正确的,如果您使用此选项(甚至用于收集信息),您没有使用SSL获取该信息,这意味着您的请求很容易被滥用。我不确定这是如何回答问题的。
curl --connect-to www.example.com:80:backend1.example.com:8080 http://www.example.com/
-H 'Host:www.example.com'