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的主要内容,如果未能解决你的问题,请参考以下文章
Python:使用 pyOpenSSL.crypto 读取 pkcs12 证书