Python子进程问题
我正在用Python写一个脚本来生成证书签名请求(CSR)。这个脚本非常简单。我通过以下方式生成一个RSA私钥:
keycmd = "openssl genrsa -out mykey.pem 2048"
keyprocess = Popen(keycmd, shell=True, stdout=PIPE)
csrcmd = "openssl req -new -key mykey.pem -subj "+ subj + " -out mycsr.csr"
reqprocess = Popen(csrcmd, shell=True, stdout=PIPE)
不过,我想增加一个功能,就是如果用户愿意,可以用密码来加密这个私钥。通常,这个功能是通过在genrsa命令中加上“-des3”选项来实现的,但我不知道怎么把一个字符串从Python的标准输入传递给OpenSSL的进程。希望能得到一些帮助。
我想做的是:
keycmd = "openssl genrsa -des3 -out mykey.pem 2048"
keyprocess = Popen(keycmd, shell=True, stdin=PIPE, stdout=PIPE)
keyprocess.communicate("password")
keyprocess.communicate("password")
但是这个方法不行,脚本就卡住了,根本无法执行到第一个通信语句。
2 个回答
2
你试过使用 Pexpect 这个模块吗?
import pexpect
child = pexpect.spawn(keycmd)
child.expect("Enter pass phrase")
child.sendline("password")
child.expect("Verifying - Enter pass phrase")
child.sendline("password")
3
在使用 openssl genrsa
命令时,添加 -passout stdin
这个选项,它会从标准输入读取密码。这样你就可以通过 communicate
发送密码了。
你还可以给 -passout
选项提供其他几种值,以便从其他来源获取密码。想了解更多细节,可以查看 OpenSSL 手册。