54

我必须连接到一个 web 服务,其中一个 pkcs12 证书是必须的。这个想法是在 bash 脚本中使用 curl(具体来说,在 OS X 下)。

我了解到 curl 在通信中不能做的少数事情之一就是处理 pkcs12 证书 (.p12)。我有什么选择?

我已经读过将证书转换为 PEM 格式会起作用(使用 openssl),但是我不知道如何告诉 curl 它获得了 PEM 并且应该与请求 PKCS12 证书的 Web 服务进行通信。

将 pkcs12 转换为 pem 可以这样完成(例如),它对我有用,但是我没有成功地将它们与 curl 一起使用:

openssl pkcs12 -in mycert.p12 -out file.key.pem -nocerts -nodes
openssl pkcs12 -in mycert.p12 -out file.crt.pem -clcerts -nokeys

任何提示?或者,卷曲的任何替代品?解决方案应该基于命令行。

4

3 回答 3

87

我想你已经解决了,但我遇到了同样的问题。我回答分享我的解决方案。

如果您有一个 .p12 文件,那么您的方法是正确的。首先,您必须将证书和密钥从 p12 文件中分离出来。例如,如果您有一个 mycert.p12 文件,请执行

openssl pkcs12 -in mycert.p12 -out file.key.pem -nocerts -nodes
openssl pkcs12 -in mycert.p12 -out file.crt.pem -clcerts -nokeys

然后你必须拨打你的网址。例如假设您想要获取特定 Web 服务的 wsdl

curl -E ./file.crt.pem --key ./file.key.pem https://myservice.com/service?wsdl

如果文件 file.crt.pem 和 file.key.pem 在您的工作文件夹中,“./”是强制性的。

于 2015-11-25T10:45:16.917 回答
54

检查你是否有更新的卷曲。较新的版本可以直接处理 PKCS12。

curl --cert-type P12 --cert cert.p12:password https://yoursite.com
于 2019-04-28T13:49:05.727 回答
0

比奥夫的答案是正确的。

他建议这样做:

curl --cert-type P12 --cert cert.p12:password https://yoursite.com

出于某种原因,这对我不起作用。我得到:

curl 无法打开 PKCS12 文件

我只是在没有密码的情况下导出了p12文件,最后只使用了以下格式。

curl --cert-type P12 --cert cert.p12 https://yoursite.com

您可以轻松检查您是否curl可以处理p12. 很可能确实如此。只需执行man curl并向下滚动,直到找到cert-type. 我的是这样的:

--cert-type <type>

(TLS) 告诉 curl 提供的客户端证书正在使用什么类型。PEM、DER、ENG 和 P12 是公认的类型。如果未指定,则假定为 PEM。

如果多次使用此选项,将使用最后一个。

(我不相信cmmd + F终端中不可见的文本有效。所以你必须向下滚动。

于 2020-12-12T22:06:54.947 回答