Проблема подпроцесса Python - PullRequest
2 голосов
/ 11 августа 2010

Я пишу скрипт для генерации CSR в Python.Сценарий очень прост.Я генерирую закрытый ключ 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)

Однако я хочу добавить функциональность для шифрования личного ключа паролем по желанию пользователя.Обычно это делается путем включения опции «-des3» в команду genrsa, но я не знаю, как передать строку из стандартного ввода 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 ]

3 голосов
/ 11 августа 2010

Добавьте параметр -passout stdin к команде openssl genrsa, и она будет считывать парольную фразу из стандартного ввода.Это должно позволить вам отправить его через communicate.

Есть несколько других значений, которые вы можете предоставить опции -passout для получения ключевой фразы из другого источника.Подробнее см. Справочную страницу OpenSSL .

2 голосов
/ 11 августа 2010

Вы пробовали модуль Pexpect ?

import pexpect

child = pexpect.spawn(keycmd)
child.expect("Enter pass phrase")
child.sendline("password")

child.expect("Verifying - Enter pass phrase")
child.sendline("password")
...