【问题标题】:Unable to feed certificate and key into openssl via stdin无法通过标准输入将证书和密钥输入到 openssl
【发布时间】:2019-01-31 21:49:00
【问题描述】:

我已经按照steps listed here 创建了一个新的私钥和证书。现在我正在尝试将它们组合成一个 .pfx 文件。

OpenSSL 应该能够从单个文件中读取私钥和证书,并且根据 man man 文档,还应该能够从 stdin 中读取。但是,这似乎对我不起作用。

在 Mac OS X 10.14.3 和 openssl version 上提供“LibreSSL 2.6.5”。

我将我的证书和密钥合并到一个文件中(称为“combined.pem”)。我使用以下命令做到了这一点:

$ openssl genrsa -out private.key 2048
$ openssl req -new -x509 -key private.key -out public.cer -days 365
$ cat public.cer >> combined.pem
$ cat private.key >> combined.pem

作为参考,combined.pem 看起来像这样:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

当我运行以下命令时,一切正常:

$ openssl pkcs12 -export -out x509.pfx -in combined.pem

当我运行这个命令时,我得到一个错误:

$ openssl pkcs12 -export -out x509.pfx < combined.pem
unable to load certificates

我也试过了:

$ cat combined.pem | openssl pkcs12 -export -out x509.pfx
unable to load certificates

我错过了什么? OpenSSL 真的不能从stdin 读取这个吗?

另外,来自man 文档:

     -in file
           The input file to read from, or standard input if not specified.  The order doesn't matter but one private key and its corresponding certificate should
           be present.  If additional certificates are present, they will also be included in the PKCS#12 file.

     -inkey file
           File to read a private key from.  If not present, a private key must be present in the input file.

【问题讨论】:

    标签: openssl x509


    【解决方案1】:

    与这里的大多数答案相反,OpenSSL 确实可以开箱即用地使用标准输入,包括在 macOS 上。诀窍是完全去掉-in 参数。

    cat combined.pem | openssl pkcs12 -export -out x509.pfx
    

    【讨论】:

    • 仅适用于 OSX 10.14.16 - OpenSSL 1.1.1d 2019 年 9 月 10 日。
    • 很高兴能帮上忙!
    【解决方案2】:

    从我收集到的 from this questionOpenSSL 确实 与开箱即用的标准输入一起工作。您可以尝试的一件事是使用一些技巧:

    openssl pkcs12 -export -out x509.pfx -in /dev/stdin < combined.pem
    

    我尚未测试您的特定证书组合案例,但 /dev/stdin 重定向部分应该可以让您在 OpenSSL 中拥有“类似标准输入”的功能

    【讨论】:

    • 无法让 - 在 osx 上工作。 /dev/stdin 是个好主意
    【解决方案3】:

    我遇到了类似的问题,在 OpenSSL Github 贡献者的帮助下,我设法确定通过标准输入输入 PEM 文件可以工作,但您必须有一个 PEM 文件包含证书之前的密钥。

    根据this commentpkcs12 命令通过打开输入、扫描键并读取它们来处理;然后重新打开输入(或回到开头),扫描证书并阅读它们。当输入是文件(例如通过-in somefile)时,此重新打开/搜索会将读取位置重置为文件的开头,但是当输入是stdin 流 时(例如通过-in somefile通过in -cat |&lt; file 或只是省略-in),重新打开/搜索被忽略,它从它停止的地方继续(因为标准输入流是只进的)。

    因此,如果输入流在密钥之前包含证书,则密钥扫描(从流的开头开始)会消耗所有流直到密钥数据的末尾,而忽略证书数据;然后证书扫描(从密钥数据的末尾开始)在找到任何证书之前到达流的末尾,因此您会得到unable to load certificates 结果。

    如果输入流包含证书之前的密钥,则密钥扫描(从流的开头开始)首先找到密钥,然后证书扫描(从密钥数据的末尾开始)第二次找到证书,一切正常。

    OpenSSL(当前)在其正常输出中的密钥之前发出其证书,因此您不能轻易地将 pkcs12 调用连接在一起。

    TL;DR: 使用cat private.key public.cer &gt; combined.pem,而不是cat public.cer private.key &gt; combined.pem

    【讨论】:

    • 我在 PEM 中将密钥排在第二位,直到我发现这个问题才发现问题!
    【解决方案4】:

    一些命令行实用程序在使用标准输入时需要一个破折号; openssl x509 似乎遵循这一点(在 Ubuntu 18.04 上测试,所以我有理由认为这是可移植的语法)。

    cat combined.pem | openssl pkcs12 -export -out x509.pfx -in -
    

    【讨论】:

      【解决方案5】:

      事实是 - 这取决于确切的 openssl 命令。

      对于openssl crl,省略-in 参数就足够了:

      curl -s ${VAULT_ADDR}/v1/pki/crl 2>&1 | openssl crl -inform der -noout -text
      

      对于openssl x509,您必须提供-in - 参数:

      curl -s ${VAULT_ADDR}/v1/pki/ca 2>&1 | openssl x509 -text -noout -nameopt multiline,show_type -in -
      

      我想我的建议是在您的特定情况下测试这两个中的一个。

      【讨论】:

        猜你喜欢
        • 2011-09-13
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 2013-01-02
        • 2022-07-05
        • 2011-10-06
        • 1970-01-01
        • 2013-03-18
        相关资源
        最近更新 更多