Python子进程问题

2 投票
2 回答
2091 浏览
提问于 2025-04-16 02:39

我正在用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 手册

撰写回答