【发布时间】:2014-06-19 23:42:43
【问题描述】:
我正在用 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 密码:”。输入此内容后,我在communicate() 中的其余参数按预期执行......只是无法让它自动输入 PEM 密码短语。该站点上的其他一些类似提到使用“expect”或“pexpect”的问题,但这似乎过于复杂。这是唯一的方法吗?另外,pexpect 默认不附带 Python 2.7,因此您必须在安装 Python 后添加它,这是我需要在不同机器上经常做的事情。
编辑:看起来 pexpect 无论如何都适用于 UNIX 机器。我在 Windows 上执行此操作。
【问题讨论】:
-
你能得到一个
-passin arg从命令行使用 OpenSSL 吗? -
我不能。我总是得到一个“未知选项”。我试着把它放在 openssl 之后,比如 openssl req -passin pass:password 以及最后和中间的某个地方,但它总是说 known option。
-
实际上,我只是再次尝试以确保在最后抛出它时它没有说“未知选项”,但它仍然提示输入“输入 PEM 密码:”部分.
-
啊,实际上,我认为您不需要
-passin,因为您没有提供密钥。从命令行尝试-passout- 我认为这就是您被提示的内容。 -
所以在命令 shell 中输入它(使用 -passout)是可行的,但使用 subprocess.Popen 的完全相同的语句却没有:p = subprocess.Popen(['openssl', 'req' , '-passout pass:mypassword','-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='\nXFAMILY-' +date +'\n' +email +'\n' +'\n' +'\n' +'\n' +common_name +'\n') 我得到一个“未知选项”。