【问题标题】:cURL with a PKCS#12 certificate in a bash scriptbash 脚本中带有 PKCS#12 证书的 cURL
【发布时间】: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

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

【问题讨论】:

    标签: bash curl openssl pkcs12


    【解决方案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 甚至可能不是必需的
    猜你喜欢
    • 2011-05-21
    • 2019-05-28
    • 1970-01-01
    • 2017-08-09
    • 2013-07-03
    • 2013-02-15
    • 2010-11-06
    • 2016-07-08
    相关资源
    最近更新 更多