无法通过标准输入提供证书和密钥到openssl

时间:2019-01-31 21:49:00

标签: openssl x509

我已经遵循steps listed here来创建新的私钥和证书。现在,我正在尝试将它们合并为.pfx文件。

OpenSSL应该能够从单个文件中读入私钥和证书,并且据man文档的人说,OpenSSL还应该能够从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.

4 个答案:

答案 0 :(得分:2)

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

根据this commentpkcs12命令通过打开输入,扫描键并读取它们来进行处理;然后重新打开输入(或回头查找),扫描证书并读取它们。当输入是文件时(例如通过-in somefile),此重新打开/搜索会将读取位置重置为文件的开头,但是当输入是 stdin流时(例如,通过in -cat |< file或仅省略-in),重新打开/搜索将被忽略,并且从中断处继续进行(因为stdin流是仅限前进)。

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

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

OpenSSL(当前)在其正常输出中的密钥之前会先发出其证书,这一点使人更恼火。因此,您不容易将pkcs12调用一起管道传输。

TL; DR: 执行cat private.key public.cer > combined.pem,而不是cat public.cer private.key > combined.pem

答案 1 :(得分:0)

从我收集的资料from this question来看,OpenSSL确实不能与标准输入一起使用。您可以尝试的一件事是使用一些技巧:

<div class="BuyButtonsTxt">
                ב-<a aria-label="לקנייה ב-פיסי אונליין Dell Inspiron 15 3580 
N3580-5092" href="/fs.aspx?pid=666473435&amp;sog=c-pclaptop" id="" 
target="_blank">פיסי אונליין</a>
</div>

我还没有测试您的特定证书组合情况,但是openssl pkcs12 -export -out x509.pfx -in /dev/stdin < combined.pem 重定向应该可以使您在OpenSSL中具有“类似stdin”的功能

答案 2 :(得分:0)

使用标准输入时,几个命令行实用程序期望一个破折号; openssl x509似乎遵循了这一要求(在Ubuntu 18.04上进行了测试,因此我可以合理地期望这是可移植的语法)。

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

答案 3 :(得分:0)

与大多数回答相反,即使在macOS上,OpenSSL也可以与标准输入一起使用。诀窍是完全排除-in参数。

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