如何在cURL中使用自签名证书?

44

我有一个使用自签名证书运行的Flask应用程序。 我可以使用以下命令发送curl请求:

curl -v -k -H "Content-Type: application/json" -d '{"data":"value1","key":"value2"}' https://<server_ip>:<port>

冗长的日志显示一切都很顺利。

我想避免使用 -k (--insecure) 选项,而是指定一个 curl 可以使用的 .pem 文件。查看 curl 手册页,我发现可以使用 --cert 选项来实现这一点。 于是我使用以下方法创建了一个 .pem 文件:

openssl rsa -in server.key -text > private.pem

当我使用private.pem文件时,CURL会抛出这个错误:

curl: (58) unable to use client certificate (no key found or wrong pass phrase?)

有什么建议吗?还是只有使用经过正确签名的证书才可能实现?

谢谢

2个回答

90
这只是另一个版本的此问题:使用openssl获取服务器证书 或者更加直接地说:
使用curl --cert是错误的,它是用于客户端证书的。
首先,获取你的服务器正在使用的证书:
$ echo quit | openssl s_client -showcerts -servername server -connect server:443 > cacert.pem

对于SNI,-servername参数是必需的,以便您获得正确的虚拟服务器证书。

然后使您的curl命令行使用该设置来验证后续操作中的服务器:

$ curl --cacert cacert.pem https://server/ [and the rest]

特别预告

从curl 7.88.0(将于2023年2月发布)开始,curl可以使用新的%{certs}变量自行保存证书,以备不时之需,这个功能可通过-w选项实现。详情请参阅此处博客


5
我尝试过这样做,但仍然遇到相同的错误:“curl: (58) 无法使用客户端证书(未找到密钥或密码错误?)”。我按照这些说明生成了自签名的客户端和服务器证书:http://dst.lbl.gov/~boverhof/openssl_certs.html。我还可能错过了什么吗? - nmurthy
5
此命令将另外的输出添加到了cacert.pem文件中。您可以使用以下命令行替代:´openssl s_client -showcerts -servername server -connect server:443 < /dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p' > server.pem´。 - Christian
2
同时,应该告诉openssl“退出”以避免挂起(并导致Web服务器出现“错误请求”):echo quit | openssl s_client -showcerts -servername server -connect server:443 > cacert.pem - bryn
请注意,-servername 假定服务器支持 SNI。Apache 1.x - 2.2 不支持,因此省略 -servername 参数。https://www.openssl.org/docs/manmaster/man1/s_client.html - txyoji
感谢您的帖子,它帮助我通过curl从https服务器发出请求。以下命令是我使用的: $ curl --cacert file-path.pem https://localhost:443 - Alabi Temitope
我正在尝试在Mac上运行此程序,但效果不是很好。生成的cacert.pem文件是否应该以“CONNECTED(00000003)---Certificate chain”开头? - Ninjaxor

1

使用curl从https服务器发出请求。 我使用以下步骤:

  • 步骤1:在要使用它的项目根目录中使用以下代码生成自签名证书。openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -nodes
  • 步骤2:填写所需详细信息的提示,但当您到达Common Name输入localhost时,例如Common Name (eg, fully qualified host name) []:localhost
  • 步骤3:当您的openssl cert.pem和key.pem已生成并启动服务器后,在另一个终端或命令行中运行curl --cacert cert.pem https://localhost:443

注意:我使用的是默认的https端口443,您可以使用其他端口,然后确保cert.pem文件路径被正确引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接