如何在没有交互的情况下为P12到PEM文件转换指定密码。

时间:2012-08-11 04:05:51

标签: macos shell unix terminal

我正在尝试将P12文件转换为PEM文件。当我执行命令时,终端要求我做三件事:

P12密码(我输入,点击输入)
PEM密码(输入,输入)
PEM密码确认(输入,输入)

我知道我可以使用以下方法一次性执行sudo命令:

echo sudopassword | sudo rm -rf /file.p12;

如何一次性添加所有三个值?感谢

4 个答案:

答案 0 :(得分:0)

你能解释一下这些P12文件是什么吗?我发现this link处理了使用openssl将pkcs12证书/密钥文件转换为.PEM格式的问题。 (http://gridsite.org)

答案的关键是:

使用-passin file:...-passout file:...进行无人值守处理

我猜您必须为此案例指定-passin file:P12passphrase-passout file PEMpassphrase选项。

这个小测试确认了如何通过file:<...>参数指定输入密码。这有助于隐藏任何肩膀攻击中的此类短语。不要忘记限制对这些文件的访问。虽然它是大多数openssl命令的共同特征,但它没有明确提及,它是原始问题的关键。完整的选项列表如下。

$ openssl pkcs12 -passin file:P12phrase
Can't open file P12phrase
Error getting passwords

(我把它留给OP来构建完整的命令。)

以下是pkcs12子命令的所有受支持选项:

$ openssl pkcs12 help 
Usage: pkcs12 [options]
where options are
-export       output PKCS12 file
-chain        add certificate chain
-inkey file   private key if not infile
-certfile f   add all certs in f
-CApath arg   - PEM format directory of CA's
-CAfile arg   - PEM format file of CA's
-name "name"  use name as friendly name
-caname "nm"  use nm as CA friendly name (can be used more than once).
-in  infile   input filename
-out outfile  output filename
-noout        don't output anything, just verify.
-nomacver     don't verify MAC.
-nocerts      don't output certificates.
-clcerts      only output client certificates.
-cacerts      only output CA certificates.
-nokeys       don't output private keys.
-info         give info about PKCS#12 structure.
-des          encrypt private keys with DES
-des3         encrypt private keys with triple DES (default)
-aes128, -aes192, -aes256
              encrypt PEM output with cbc aes
-nodes        don't encrypt private keys
-noiter       don't use encryption iteration
-maciter      use MAC iteration
-twopass      separate MAC, encryption passwords
-descert      encrypt PKCS#12 certificates with triple DES (default RC2-40)
-certpbe alg  specify certificate PBE algorithm (default RC2-40)
-keypbe alg   specify private key PBE algorithm (default 3DES)
-keyex        set MS key exchange type
-keysig       set MS key signature type
-password p   set import/export password source
-passin p     input file pass phrase source
-passout p    output file pass phrase source
-engine e     use engine e, possibly a hardware device.
-rand file:file:...
              load the file (or the files in the directory) into
              the random number generator
-CSP name     Microsoft CSP name
-LMK          Add local machine keyset attribute to private key

答案 1 :(得分:0)

这些命令不太可能从stdin读取。他们更有可能直接从终端阅读。这允许他们设置一个不会将密码回显到屏幕的模式。尝试将您的输入回显到/dev/tty

除此之外,您还需要使用类似expect / pexect的内容来控制这些内容。这些项目专门为此目的而建。


Openssl有一个-stdin optoin来从stdin读取它的输入。这有效:

tmp=`mktemp`
cat > $tmp <<EOF                                                                                       







$1                                                                                      

EOF                                                                                     
cat $tmp | openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout privateKey.key 

我使用cat和here-document来避免将密码放在命令行上。

答案 2 :(得分:0)

我使用了openssl pkcs12 -in Certificates.p12 -out sampleCore.pem -nodes,它对我有用。

答案 3 :(得分:-1)

您是否尝试过回显三条线?它可能会起作用

echo $'P12 passphrase\nPEM passphrase\nPEM passphrase confirm' | cmd

虽然我觉得我必须指出,回复这样的密码是非常不安全的。密码不仅会在您的bash历史记录文件中结束,而且对于运行ps的系统中的任何其他人也可以看到。