curl 是否有像 wget 这样的 --no-check-certificate 选项?

cwd*_*cwd 573 wget curl

我正在尝试向运行带有自签名 SSL 证书的开发站点的本地开发服务器之一发出 curl 请求。我正在从命令行使用 curl。

我看到一些博客文章提到您可以添加到证书列表或指定一个特定的(自签名)证书为有效,但是是否有一种“不验证”ssl 证书的通用方式 - 就像--no-check-certificate那个wget有吗?

Fre*_*eit 766

是的。从联机帮助页

-k, --不安全

(TLS) 默认情况下,curl 建立的每个 SSL 连接都经过验证是安全的。此选项允许 curl 继续和操作,即使服务器连接被认为是不安全的。

通过确保服务器的证书包含正确的名称并使用证书存储成功验证来验证服务器连接。

有关更多详细信息,请参阅此在线资源:https : //curl.haxx.se/docs/sslcerts.html

另请参阅--proxy-insecure 和--cacert。

该联机帮助页条目中提到的参考描述了-k.

这些行为可以通过curl来自BadSSL.com 的测试页面的请求观察到

curl -X GET https://wrong.host.badssl.com/
curl: (51) SSL: no alternative certificate subject name matches target host name 'wrong.host.badssl.com'

curl -k -X GET https://wrong.host.badssl.com/
..returns HTML content...
Run Code Online (Sandbox Code Playgroud)

  • 喜欢它有一个字母短选项的事实 (19认同)
  • @Wins,这将是一个可怕的想法。如果您需要重复使用别名,请正确使用别名,这样您就知道它的作用并且不会意外发送未加密的密码。`别名 insecure-curl="curl -k"` (8认同)
  • @DanielH 这就是我建议使用别名的原因:这样您就可以通过明确知道它不安全而获得额外的便利。工作流程发生变化:但是,当您为了方便而交易证券时,您仍然应该以某种有限的方式知道。 (7认同)
  • @AlexanderHuszagh 在工作中,我只使用带有自签名证书的单个服务器的 curl;我从来没有想过进行完整的证书检查。仅仅因为某些事情在大多数情况下看起来像一个可怕的想法并不意味着它总是如此。 (4认同)
  • 在curl配置中是否有任何方法可以将此选项设为默认值? (3认同)

ken*_*orb 45

您可以使用以下命令对所有连接应用更改:

$ echo insecure >> ~/.curlrc
Run Code Online (Sandbox Code Playgroud)

在Windows上刚刚创建_curlrc以“不安全的”它在你的文本的文本文件%HOME%%CURL_HOME%%APPDATA%%USERPROFILE%%USERPROFILE%\Application Data目录。

使用上述解决方案的优点是它适用于所有curl命令,但不推荐使用,因为它可能通过连接到不安全和不受信任的主机而引入MITM 攻击

  • 这似乎是个糟糕的建议:禁用对所有连接的这些检查不应该是默认设置,即使您通过每个用户配置对自己执行此操作。如果您需要取消安全检查,至少要逐项进行。 (82认同)
  • @EricHartford:嗯,对你有好处,但恕我直言,这仍然不是一个好的一般建议。人们可能会使用 curl,例如在 osx 上下载自制软件并最终得到工具的修改版本时,因为他盲目地将其作为默认设置启用。 (14认同)
  • 另外@EricHartford你确定你总是做值得信赖的卷曲吗?您是否曾经运行过任何从 Internet 上获取的 bash 安装脚本?当然,无论如何你都可以在那里陷入困境,但这增加了机会。 (12认同)
  • 每当我使用 curl 时,我要么控制另一端的机器,要么信任另一端的机器。 (4认同)
  • 这是真正的@EricHartford。上一条消息是别人冒充我发的。_因为我信任所有机器_ ;-) (2认同)
  • 你如何扭转它?:) (2认同)

小智 12

您正在使用自签名证书。为什么不将 CA 附加到受信任的 CA 包 (Linux) 或添加到受信任的证书存储区 (Windows)?或者简单地--cacert /Path/to/file与您信任的自签名证书文件的内容一起使用。

其他答案是根据wget可比性回答问题。然而,真正的问题是我如何使用curl. 根据许多评论,安全是这些答案中任何一个的首要问题,最好的答案是信任自签名证书并curl保持安全检查不变。


Rah*_*waj 5

添加到user3258557的答案中,假设您需要使用自己的根 CA 等测试自己的一些假服务器。而且您只是不想使用 curl 的-k选项。

首先,让我们为您的根 CA 创建一个 RSA 密钥:

openssl genrsa -des3 -out rootCA.key 4096
Run Code Online (Sandbox Code Playgroud)

然后,使用该密钥,让我们为自己的 CA 签署一个证书:

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
Run Code Online (Sandbox Code Playgroud)

现在,您有一个带有私钥和证书的根 CA。

现在让我们为我们自己的网站生成密钥和证书:

openssl genrsa -out mainsite.net.key 2048
Run Code Online (Sandbox Code Playgroud)

现在,在创建证书之前,我们首先需要一个证书签名请求 (CSR)。然后我们的根 CA 将“签署”CSR 并为我们的网站生成证书。

openssl req -new -key mainsite.net.key -out mainsite.net.csr
Run Code Online (Sandbox Code Playgroud)

让我们最终为我们的网站创建证书:

openssl x509 -req -in mainsite.net.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out mainsite.net.crt -days 500 -sha256
Run Code Online (Sandbox Code Playgroud)

为了便于使用,让.pem我们使用我们的.crt.key文件生成一个文件:

cat mainsite.net.key mainsite.net.crt > mainsite.net.pem
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用此.pem文件运行一个简单的服务器。说这个服务器运行在127.0.0.1:12345

对于 curl 请求,您可以这样做:

curl --cacert "rootCA.crt" https://127.0.0.1:12345/
Run Code Online (Sandbox Code Playgroud)

更进一步,如果您想使用 SNI 在一个端口上托管多个站点,您可以为每个站点生成密钥,签署 CSR 并使用如下所示的 curl 请求:

curl --resolve subsite1.mainsite.net:12345:127.0.0.1 -X GET --cacert "rootCA.crt" --cert "subsite1.mainsite.net.crt" --key "subsite1.mainsite.net.key" https://subsite1.mainsite.net:12345/
Run Code Online (Sandbox Code Playgroud)