从命令行使用CURL的https连接

从命令行使用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

我不熟悉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: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

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

  • 从这里获取根CA证书包:并将其保存在本地

  • 查找
    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'