【问题标题】:Python subprocess problemPython子进程问题
【发布时间】:2010-08-11 17:10:31
【问题描述】:

我正在编写一个脚本以在 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")

但是它不起作用,脚本只是冻结并且永远不会超过第一个通信语句。

【问题讨论】:

标签: python openssl pipe csr


【解决方案1】:

将选项-passout stdin 添加到openssl genrsa 命令,它将从标准输入读取密码。这应该允许您通过communicate 发送它。

您可以向-passout 选项提供几个其他值,以从其他来源获取密码。详情请见OpenSSL man page

【讨论】:

  • 我在 shell 中输入以下内容: openssl genrsa -out mykey.pem -passout stdin 1024 它等待来自标准输入的输入。我输入一个单词,然后按 Enter。但是,生成的私钥没有加密。任何想法为什么会这样?
  • 我猜这是因为您没有提供 -des3 选项。 -passout 只告诉 OpenSSL 从给定源读取密码,它不会告诉它使用密码做任何事情。
【解决方案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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-20
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多