bash 脚本中带有 PKCS#12 证书的 cURL

Posted

技术标签:

【中文标题】bash 脚本中带有 PKCS#12 证书的 cURL【英文标题】:cURL with a PKCS#12 certificate in a bash script 【发布时间】:2015-11-22 02:29:04 【问题描述】:

我必须连接到一个 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

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

【问题讨论】:

【参考方案1】:

bioffes 的答案是正确的。

他建议这样做:

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 对终端中不可见的文本起作用。所以你必须向下滚动。

【讨论】:

第一个带密码的命令只要密码正确就可以工作,否则你会得到错误。【参考方案2】:

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

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

【讨论】:

你可能需要添加 "--insecure" curl --insecure --cert-type P12 --cert cert.p12:password yoursite.com @mancocapac 它有点违背了安全连接的目的 你是对的,但在我的情况下它是必需的。为 X 公司工作,他们有一个证书并在内部使用它,它没有在 CA 注册。没有这个标志,我不能使用 curl 也不能使用邮递员。 @mancocapac 不需要使用 --insecure。使用私有 CA 时,使用私有 CA 的私有 CA 证书,而不是 --insecure。 @mancocapac,感谢 --insecure 它对我有用【参考方案3】:

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

如果您有一个 .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 在您的工作文件夹中,“./”是强制性的。

【讨论】:

对我来说这有效: curl -k --cert ./file.crt.pem --cert-type PEM --key ./file.key.pem --key-type PEM --通过 "" 只是让人们知道,如果您在上面的评论中使用 curl -k 作为 Kartins,您将禁用 https 检查。 另外,使用-nodes 会禁用加密,这意味着您将私钥从受密码保护的加密文件中取出,并将其存储为未受保护的未加密文件;某些版本的 curl 支持加密的 PEM 文件,因此 -nodes 甚至可能不是必需的

以上是关于bash 脚本中带有 PKCS#12 证书的 cURL的主要内容,如果未能解决你的问题,请参考以下文章

如何编程读取PKCS#12格式的证书与私钥

读取pkcs12证书信息

Python:使用 pyOpenSSL.crypto 读取 pkcs12 证书

如何使用keytool将证书创建到PKCS12密钥库?

读取bash脚本中的输入,该脚本是路径中带有空格的目录[重复]

如何使用 keytool 列出存储在 PKCS12 密钥库中的证书?