从命令行使用CURL的https连接


127

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

但是得到了同样的错误。


不知道的解决方案,你是在暗示,但我只是在寻找类似信息,我发现这个有用的网站使用curl与PHP unitstep.net/blog/2009/05/05/...
MauroPerez

1
您还可以添加--insecure以忽略SSL错误。
Alexej Magura

卷曲的新版本(如7.64)将不承认旧的密码一样RC4-SHA -使用curl(7.46)的旧版本帮我serverfault.com/questions/889631/...
hello_earth

Answers:


142

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

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

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


5
-k标志是一个不错的快捷方式。为我工作!
tidydee

45

简单的解决方案

那是我的日常脚本:

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

11
因此,您--insecure每天都允许通过TSL 进行连接...
Brethlosze

2
@Brethlosze感谢您的评论。但是,事实并非如此。关键是要从各种证书中获取SSL信息。
安东尼奥·菲托萨

30

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


1
您能解释一下传递用户名和密码的目的吗?如果我正在编写Java客户端,该如何在GET请求的标头中传递userName和密码?
Shubhi224 '18

如果您的https服务器不需要GET请求的简单身份验证,则@ Shubhi224不会。我必须使用身份验证,因为这是需要它的REST调用。
Somaiah Kumbera

如该答案中所述:“您需要提供整个证书链才能进行卷曲,因为curl不再附带任何CA证书。”
穆罕默德·巴纳

16

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


6

我实际上遇到了此类问题,可以通过以下步骤解决:

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

  2. 查找php.ini文件

  3. 将设置curl.cainfo为证书的路径。因此,它将类似于:

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



1

诊断出问题后,我能够使用现有的系统默认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服务器。



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>


-2

使用现代版本的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' 

我不确定这将如何回答问题。
Brethlosze
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.