Введите пароль в OpenSSL с помощью Python

#python #openssl #popen

#python #openssl #popen

Вопрос:

Я пишу скрипт на Python для автоматизации создания сертификатов. Я могу успешно использовать подпроцесс.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')
  

Любая попытка, которую я делаю с переключателями паролей, приводит к «неизвестной опции -передача (-passin, passwd и т. Д.)». Все, что я хочу иметь возможность делать, это автоматически вводить пароль, который был введен ранее с помощью «getpass» в команду openssl.

Прямо сейчас, когда код выполняется, он переходит к приведенной выше команде и говорит «Введите пароль PEM: «. После того, как я ввожу это, остальные параметры, которые у меня есть в communicate(), выполняются, как и ожидалось…просто не удается заставить его автоматически вводить кодовую фразу PEM. В некоторых других вопросах на этом сайте, которые похожи, упоминается использование «expect» или «pexpect», но это кажется слишком сложным. Это единственный способ? Кроме того, pexpect по умолчанию не поставляется с Python 2.7, поэтому вам придется добавить его после установки Python, и это то, что мне нужно будет часто делать на разных машинах.

Редактировать: похоже, что pexpect в любом случае предназначен для UNIX-машин. Я делаю это в Windows.

Комментарии:

1. Можете ли вы заставить a -passin arg работать с OpenSSL из командной строки?

2. Я не могу. Я всегда получаю «неизвестный вариант». Я попытался поместить его сразу после openssl, например, openssl req -passin pass:password, а также где-нибудь в конце и середине, но он всегда говорит «известный вариант».

3. На самом деле, я просто попробовал еще раз, чтобы убедиться, и он не говорит «неизвестный параметр», когда я включаю его в конце, но он по-прежнему запрашивает часть «Введите PEM-пароль: «.

4. Ах, я не думаю, что вам это нужно -passin , на самом деле, поскольку вы не предоставляете ключ. Попробуйте -passout из командной строки — я думаю, это то, что вам предлагается.

5. Итак, ввод его в командной оболочке (с использованием -passout ) работает, но точно такой же оператор использует подпроцесс. Popen, не выполняет: p = подпроцесс. Popen([‘openssl’, ‘req’, ‘-passout pass:mypassword’,’-new’, ‘-x509’, ‘-extensions’, ‘v3_ca’, ‘-keyout’, ‘c:\cert\sslcert\private\cakey.pem ‘, ‘-вон’, ‘c:\cert\sslcert\cacert.pem ‘, ‘-дни’, ‘3653’, ‘-config’, ‘c:\cert\sslcert\openssl.cnf ‘],stdin=подпроцесс. КАНАЛ, стандартный вывод=подпроцесс. PIPE) стандартный вывод, stderr = p.связь (ввод = ‘nXFAMILY-‘ дата ‘n’ электронная почта ‘n’ ‘n’ ‘n’ ‘n’ common_name ‘n’) Я получаю «неизвестный параметр».

Ответ №1:

Когда вы передаете аргументы Popen() , вам необходимо разделить параметры и значение. -passout pass:mypassword должно быть два аргумента, а не один.

Комментарии:

1. Спасибо, это была проблема!