使用 CURL 调用双向 SSL Web 服务

Invoking mutual 2 way SSL webservice using CURL

1)我使用以下命令创建了 myfile.csr

req -out myfile.csr -new -newkey rsa:2048 -nodes -keyout myfile-pr.key
  1. 我已将 myfile.csr 发送给第 3 方进行签名
  2. 第 3 方申请已签名并发送给我 serverfile.pem

使用这些文件我将能够使用 curl 命令调用 REST 网络服务。我尝试了以下命令,但它返回了未经授权的错误

curl --cacert ./serverfile.pem --key ./myfile-pr.key --cert ./myfile.csr --pass <password>   https://serverpost:port/getEmployeeInfo

... schannel: sending initial handshake data: sending ....

curl 不支持在命令行上使用 SChannel 的客户端证书。参见 this bug report and this todo

--cacert 用于指定具有public 证书颁发机构(CA) 证书的文件。如果您在系统上安装了第 3 方 CA 证书,则不需要此选项。

使用 --cert 指定根据您的 CSR 颁发给您的签名客户端证书。来自 man curl:

-E, --cert <certificate[:password]>
Tells curl to use the specified client certificate file when getting a file with HTTPS, FTPS or another SSL-based protocol. The certificate must be in PKCS#12 format if using Secure Transport, or PEM format if using any other engine. If the optional password isn't specified, it will be queried for on the terminal. Note that this option assumes a "certificate" file that is the private key and the client certificate concate‐ nated! See -E, --cert and --key to specify them independently.

目前,您正在通过 --cert 参数传递 CSR(证书签名请求)。您的命令应如下所示:

curl --cacert ./3rd-party-ca-cert.pem --key ./myfile-pr.key --cert ./serverfile.pem --pass <password>   https://serverpost:port/getEmployeeInfo

正如我提到的,如果您已经添加了此 CA(例如在 ubuntu https://superuser.com/a/719047 上),则可能不需要 --cacert

检查 serverfile.pem 以确保它只包含客户端证书,而不包含第 3 方 CA 证书链。

@SteffenUllrich:对不起,我应该格式化得更好。

问题是我在 windows(curl 7.55.1) 中尝试 curl。不知道是不是版本问题。在 Linux 中执行了以下命令并且有效

openssl pkcs12 -export -out combine.p12 -inkey client-cert-pr.key -in serverSelfSigned-cert.pem 
openssl pkcs12 -in combine.p12 -out ile.key.pem -nocerts -nodes 
openssl pkcs12 -in combine.p12 -out   file.crt.pem -clcerts -nokeys 
curl -E ./file.crt.pem --key ./file.key.pem https://thirdpartyserver.com/employee

备注:
客户端证书-pr.key:客户端私钥
serverselfsigned-cert.pem: 第三方发送的自签名证书

以下其他 2 个选项也适用。谢谢@bagljas

curl --cacert ./serverfile.pem  --key ./myfile-pr.key --cert ./serverfile.pem  --pass <passwrod>  https://serverpost:port/getEmployeeInfo

curl --key ./myfile-pr.key --cert ./serverfile.pem  --pass <passwrod>  https://serverpost:port/getEmployeeInfo

相同的命令在 windows

中不起作用