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

10 浏览
0 Comments

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

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

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

详细日志显示一切正常。

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

所以我使用以下命令创建了一个.pem文件:

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

当使用private.pem文件时,CURL抛出以下错误:

curl: (58) 无法使用客户端证书(找不到密钥或密码错误?)

有什么建议吗?或者这只有在正确签名的证书下才可能实现吗?

谢谢。

0
0 Comments

问题的原因是在通过cURL从https服务器进行请求时,需要使用自签名证书。解决方法是生成自签名证书并将其用于cURL请求。

生成自签名证书的步骤如下:

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文件路径。

0
0 Comments

问题的原因是使用了错误的命令`curl --cert`,这个命令是用来设置客户端证书的,而不是服务器证书。要解决这个问题,需要按照以下步骤获取服务器证书并在cURL命令中使用它进行验证:

1. 首先,获取服务器正在使用的证书。可以使用以下命令:

$ echo quit | openssl s_client -showcerts -servername server -connect server:443 > cacert.pem

其中,`-servername`参数是为了支持SNI,以获取正确的虚拟服务器证书。

2. 然后,在后续操作中,让cURL命令行使用这个证书进行服务器验证:

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

从curl 7.88.0版本开始,可以使用新的`%{certs}`变量将证书保存起来,可以通过`-w`选项实现。详细信息可以在这里找到:daniel.haxx.se/blog/2022/12/28/curl-w-certs/

如果按照上述步骤操作仍然出现错误`curl: (58) unable to use client certificate (no key found or wrong pass phrase?)`,则可能是其他操作出现了问题。可以参考提供的链接dst.lbl.gov/~boverhof/openssl_certs.html中的指示,检查自签名客户端和服务器证书的生成过程是否正确。

此外,还有其他的一些输出可以添加到`cacert.pem`文件中。可以使用以下命令行代替:

openssl s_client -showcerts -servername server -connect server:443 < /dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p' > server.pem

另外,为了避免连接超时和对Web服务器产生"Bad request"的情况,openssl应该被告知"quit",可以使用以下命令:

echo quit | openssl s_client -showcerts -servername server -connect server:443 > cacert.pem

需要注意的是,`-servername`参数假设服务器支持SNI。如果使用的是Apache 1.x - 2.2版本,则应省略`-servername`参数。

在Mac上进行这些操作可能会遇到问题,生成的`cacert.pem`文件是否应该以`CONNECTED(00000003)---Certificate chain`开头的问题。

0