Генерация сертификатов OpenVPN через Python скрипт
Говорят для изучения языка лучшая мотивация это нужда. Я хочу автоматизировать рутинную работу по генерации пользовательских сертификатов OpenVPN. У меня имеется табличный файл excel в котором есть следующая информация:
Организация; ФИО (полностью); e-mail; commonName (ivanovAA); № заявки (123456)
Таких записей с каждой заявкой может быть разное количество, бывает и несколько заявок.
Я умею забирать из файла эти поля и хочу передавать их в D:\OpenVPN\easy-rsa>build-key.bat
Чтобы запустив скрипт 1 раз, я мог получить сертификат для каждого пользователя (строки) в табличном файле.
Я пробовал через subprocess.call но не понимаю как передать информацию об имени файла (CN), не говоря уже об аргументах ( ФИО Организация Почта Заявка)
В терминале после запуска файла vars.bat, запускается файл build-key.bat с именем файла client1 он же уникальный CommonName
D:\OpenVPN\easy-rsa>build-key.bat client1
code = subprocess.call(["D:\OpenVPN\easy-rsa\\vars.bat"])
code = subprocess.call(["D:\OpenVPN\easy-rsa\\build-key.bat", "cname"])
Выдает:
req: Option -config needs a value
req: Use -help for summary.
ca: Option -config needs a value
ca: Use -help for summary.
�� 㤠���� ���� C:\*.old
Это ошибка появляется в терминале если перед запуском build-key.bat НЕ запустить vars.bat
Хотел зайти через модуль pyOpenSSL но возникли трудности с его установкой :(
Тут можно получить 2 батника vars.bat и build-key.bat они большие не влезают в пост. https://disk.yandex.ru/d/Gb0ODw5ducqJPQ
Помогите, пожалуйста, решить задачу.
UPD 080921 1504 Я поковырял файл openssl-1.0.0.cnf внес в него стандартные значения, теперь необходимость в запуске vars.bat отпала. Сейчас я могу создать сертификат с нужным мне именем с помощью
import os
os.system("D:\OpenVPN\\bin\openssl req -days 365 -nodes -new -keyout D:\OpenVPN\easy-rsa\keys\client5.key -out D:\OpenVPN\easy-rsa\keys\client5.csr -config D:\OpenVPN\easy-rsa\openssl-1.0.0.cnf")
Окно вывода запрашивает у меня данные
Ignoring -days; not generating a certificate
Generating a RSA private key
..........................................................................................................................................................................++++
...........++++
writing new private key to 'D:\OpenVPN\easy-rsa\keys\client5.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:77
State or Province Name (full name) [77]:77
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [MGT]:Полимер
Organizational Unit Name (eg, section) [123456]:546
Common Name (eg, your name or your server's hostname) [client1]:client5
Name [Иванов Иван Иванович]:Иванов иван иванович
Email Address [[email protected]]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Успешно принимает ручной ввод! Ура! Как вместо ручного ввода вводить нужные мне переменные?
Следующая проблема в подписании файла
os.system("D:\OpenVPN\\bin\openssl ca -days 365 -out D:\OpenVPN\easy-rsa\keys\client5.crt -in D:\OpenVPN\easy-rsa\keys\client5.csr -config D:\OpenVPN\easy-rsa\openssl-1.0.0.cnf")
ругается на ошибку
Using configuration from D:\OpenVPN\easy-rsa\openssl-1.0.0.cnf
Can't open keys/ca.key for reading, No such file or directory
14692:error:02001003:system library:fopen:No such process:crypto/bio/bss_file.c:69:fopen('keys/ca.key','r')
14692:error:2006D080:BIO routines:BIO_new_file:no such file:crypto/bio/bss_file.c:76:
unable to load CA private key
Однако в окне cmd все успешно подписывается этой же командой.
Я разобрался с subprocess, но броблема в том, что write принимает только байтовые значения, а программа не принимает байтовые значения
text3 = "D:\OpenVPN\\bin\openssl req -days 365 -nodes -new -keyout D:\OpenVPN\easy-rsa\keys\client6.key -out D:\OpenVPN\easy-rsa\keys\client6.csr -config D:\OpenVPN\easy-rsa\openssl-1.0.0.cnf"
process = subprocess.Popen(text3, stdin=subprocess.PIPE)
process.stdin.write(b'RU')
process.communicate()[0]
Вывод
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [RU]:weird input :-(