使用Python将密码传入OpenSSL

时间:2014-06-19 23:42:43

标签: python openssl popen

我正在用Python编写一个脚本来自动创建证书。我可以成功使用subprocess.Popen将输入参数传递给keytool,但我无法弄清楚如何使用OpenSSL。我做了很多研究,并尝试在几乎所有的排列中使用“-passout”,“ - passin”,“passwd”,但我总是得到一个无效的参数。我试图用“openssl ca”和“openssl req”来做这件事。

p = subprocess.Popen(['openssl', 'req', '-new', '-x509', '-extensions', 'v3_ca', '-keyout', 'c:\\cert\\sslcert\\private\\cakey.pem', '-out', 'c:\\cert\\sslcert\\cacert.pem', '-days', '3653', '-config', 'c:\\cert\\sslcert\\openssl.cnf'],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
stdout, stderr = p.communicate(input='\nXFY-' +date +'\n' +email +'\n' +'\n' +'\n' +'\n' +common_name +'\n')

我使用密码开关进行的任何尝试都会导致“未知选项-passout(-passin,passwd等)”。我希望能够做的就是自动输入之前使用“getpass”输入到openssl命令中的密码。

现在,当代码执行时,它会转到上面的命令并说“输入PEM密码:”。输入之后,我在communication()中的其余参数按预期执行...只是无法让它自动输入PEM密码短语。本网站上的其他一些问题类似于使用“expect”或“pexpect”,但这似乎过于复杂。这是唯一的方法吗?另外,默认情况下,pexpect不附带Python 2.7,因此您必须在安装Python后添加它,这是我需要经常在不同机器上执行的操作。

编辑:看起来pexpect无论如何都适用于UNIX机器。我在Windows上这样做。

1 个答案:

答案 0 :(得分:2)

当您将参数传递给Popen()时,您需要将选项和值分开。 -passout pass:mypassword应该是两个参数,而不是一个。