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

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

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

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

答案1

是的。来自联机帮助页:

-k, --不安全

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

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

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

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

参考该手册页条目中提到的描述了-k.

这些行为可以通过curl测试页面的请求来观察坏SSL.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...

答案2

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

$ echo insecure >> ~/.curlrc

在 Windows 上,只需在您的、、或目录_curlrc中创建包含“不安全”文本的文本文件。%HOME%%CURL_HOME%%APPDATA%%USERPROFILE%%USERPROFILE%\Application Data

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

答案3

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

其他答案都是基于wget可比性来回答问题。然而,真正的问题是如何使用curl.根据许多评论,安全性是这些答案中最重要的问题,最好的答案是信任自签名证书并保持curl安全检查完好无损。

答案4

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

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

openssl genrsa -des3 -out rootCA.key 4096

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

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt

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

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

openssl genrsa -out mainsite.net.key 2048

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

openssl req -new -key mainsite.net.key -out mainsite.net.csr

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

openssl x509 -req -in mainsite.net.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out mainsite.net.crt -days 500 -sha256

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

cat mainsite.net.key mainsite.net.crt > mainsite.net.pem

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

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

curl --cacert "rootCA.crt" https://127.0.0.1:12345/

更进一步,如果您想使用 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/

相关内容