在bash脚本中使用PKCS#12证书的cURL

sve*_*son 33 bash curl openssl pkcs12

我必须连接到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
Run Code Online (Sandbox Code Playgroud)

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

小智 68

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

如果您有.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
Run Code Online (Sandbox Code Playgroud)

然后你必须打电话给你的网址.例如,假设您想获取特定Web服务的wsdl

curl -E ./file.crt.pem --key ./file.key.pem https://myservice.com/service?wsdl
Run Code Online (Sandbox Code Playgroud)

如果文件file.crt.pem和file.key.pem在您的工作文件夹中,则"./"是必需的.

  • 让这里的人知道如果你在上面的评论中使用`curl -k`作为Kartins,你就是**禁用**https检查. (9认同)
  • 对我来说这工作:curl -k --cert ./file.crt.pem --cert-type PEM --key ./file.key.pem --key-type PEM --pass <ImportPassword>"<HTTPS_URL> " (3认同)
  • 另外,使用`-nodes`禁用加密,这意味着您将私钥从受密码保护的加密文件中取出,并将其存储为未受保护的未加密文件; 某些版本的curl支持加密的PEM文件,因此甚至可能不需要`-nodes` (2认同)

bio*_*ffe 8

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

curl --cert-type P12 --cert cert.p12:password https://yoursite.com
Run Code Online (Sandbox Code Playgroud)

  • @mancocapac 不需要使用 --insecure 。使用私有CA时,使用私有CA的私有CA证书,而不是--insecure。 (5认同)
  • 人们混淆了您的身份,即。向服务器表明您是谁(通过“cert”参数使用客户端证书)并信任服务器就是它所说的那个人。“insecure”参数与信任有关,这里正确的解决方案是使用指向服务器根(可能还有中间)CA 证书的“cacert”参数。简单地添加“insecure”或“k”就完全违背了 TLS 的全部意义,因为您只是绕过了它 (4认同)
  • 您可能需要添加“--insecure”curl --insecure --cert-type P12 --cert cert.p12:密码https://yoursite.com (3认同)

Hon*_*ney 5

比奥夫的回答是正确的。

他建议这样做:

curl --cert-type P12 --cert cert.p12:password https://yoursite.com
Run Code Online (Sandbox Code Playgroud)

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

curl 无法打开 PKCS12 文件

我刚刚导出了没有p12密码的文件,然后使用了以下格式:

curl --cert-type P12 --cert cert.p12 https://yoursite.com
Run Code Online (Sandbox Code Playgroud)

您可以轻松检查您是否curl可以处理p12。很可能确实如此。只需man curl输入 即可搜索该选项/cert-typeEnter。这是手册对我所说的内容:

--cert-type <type>

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

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