• XSS.stack #1 – первый литературный журнал от юзеров форума

[Вопрос]Автоматизация в генерации ssl сертификата.

hits

RAM
Пользователь
Регистрация
10.12.2018
Сообщения
148
Реакции
95
Всем Хай,есть 3 команды:
1.openssl req -new -newkey rsa:1024 -nodes -keyout client01.key \
-subj /C=RU/ST=Msk/L=Msk/O=Inc/OU=Web/CN=usr/emailAddress=usr@dm.ru \
-out client01.csr
2.openssl ca -config ca.config -in client01.csr -out client01.crt -batch
3.openssl pkcs12 -export -in client01.crt -inkey client01.key \
-certfile ca.crt -out client01.p12 -passout pass:q1w2e3
нужен скрипт,что бы запрашивал при запуске:clien name,email,passwd,после генерил и переносил файл с расширением p12 в нужную диру.скрипт пойдет,на питоне баше пыхе перл.сам нашел тока на перле,но чет в нем ваще не але,сам
Perl:
#!/usr/bin/perl -w
 
($#ARGV > -1) || die
"Usage:\n
    --rs <DOMAIN>    Request and sign domain.crt using rootCA.crt created with --ca option or other way.\n
    --ca         Request and sign rootCA.crt - root certificate for signing other.\n
    --prepare    Create neccessary folders.\n
    --usage        Display text about how to use this scripit.\n
";
 
# Подпись сертификата
if ($ARGV[0] =~ /--rs/)
{
    ($#ARGV > 0) || die "Provide Domain Name"; # Завершить работу, если не был передн домен на подпись
    $domain_name = $ARGV[1]; # Используем второй параметр, как имя домена. Здесь нет проверок и защиты от дурака, только кавычки в вызове функции
    $request_config = "./config.ini"; # Путь к конфигурационному файлу с настройками
    $ENV{'KEY_COMMON'} = $domain_name; # Передача параметра домена в конфигурационный файл через переменные среды ( Посмотрите конф. файл )
    # Команда запроса сертификата на подпись
    $request = "openssl req -new -nodes -out \"$domain_name.csr\" -keyout \"$domain_name.key\" -config $request_config";
    system($request) && die ("\nCertificate $domain_name request failed"); # Попытка выполнить команду
    # Команад подписи запроса с помощью коренвого сертификата
    $sign = "openssl ca -batch -out \"$domain_name.crt\" -config $request_config -infiles \"$domain_name.csr\" ";
    # Попытка подписать запрос
    system($sign) && die ("\nCertificate $domain_name sign failed");
    # В случае успеха перемещаем результаты по папкам
    system("mv $domain_name.crt certs/"); # Сам сертификат, публичная информация, можно передавать другим лицам
    system("mv $domain_name.csr csr/");     # Файл запроса сертификата. Нужен, когда время действия сертификата или корневого сертификата истечет,
                        # и надо будет снова подписать запрос.
    system("mv $domain_name.key keys/"); # Ключ сертификата. Приватная информация, в отличие от самого файла сертификата
    exit(0);
}
 
# Генерация корневого сертификата
if ($ARGV[0] =~ /--ca/)
{
    $ca_config = "./config.ini"; # Конфигурационный файл
    $days = "3650"; # Создаем сертификат на 3650 дней
    $ENV{'KEY_COMMON'} = 'poligon.scaytrase.ru'; # Общее имя для сертификата. Я указал тут имя своего главного домена. Можно указать название организации. Это имя будет отображаться в программах, как организация, подписавшая сертификат.
    # Команда генерации корневого сертификата
    $ca = "openssl req -new -x509 -extensions v3_ca -keyout ca/rootCA.key -out ca/rootCA.crt -days $days -config $ca_config";
    system($ca) && die ("CA request failed"); # Попытка выполнить команду
    exit(0);
}
 
# Создание необходимых файлов и директорий
if ($ARGV[0] =~ /--prepare/)
{
    system ("mkdir ./ca"); # Директория корневого сертификата
    system ("mkdir ./certs"); # Директория готовых сертификатов
    system ("mkdir ./pemcerts"); # Директория для сертификатов в формате pem
    system ("mkdir ./keys"); # Директория для ключей сертификатов
    system ("mkdir ./csr"); # Директория для файлов запроса
    system ("touch index.db"); # Индексный файл. Своеобразная база данных.
    system ("touch serial.db"); # Файл с последним номером
    system ("echo \"01\" > serial.db"); # Первый сертификат будет иметь номер 01
    exit(0);
}
 
# Переподписывание сертификатов
#if ($ARGV[0] =~ /--resign/)
#{
#    ($#ARGV > 0) || die "Provide Domain Name"; # Завершить работу, если не был передн домен на подпись
#    $domain_name = $ARGV[1]; # Используем второй параметр, как имя домена. Здесь нет проверок и защиты от дурака, только кавычки в вызове функции
#    $request_config = "./config.ini"; # Путь к конфигурационному файлу с настройками
#    $ENV{'KEY_COMMON'} = $domain_name; # Передача параметра домена в конфигурационный файл через переменные среды ( Посмотрите конф. файл )
 
#    $sign = "openssl ca -batch -out \"$domain_name.crt\" -config ./$request_config -infiles \"csr/$domain_name.csr\" ";
    # Попытка подписать запрос
#    system($sign) && die ("\nCertificate $domain_name sign failed");
    # В случае успеха перемещаем результаты по папкам
#    system("mv $domain_name.crt certs/"); # Сам сертификат, публичная информация, можно передавать другим лицам
#    system("mv $domain_name.csr csr/");     # Файл запроса сертификата. Нужен, когда время действия сертификата или корневого сертификата истечет,
                        # и надо будет снова подписать запрос.
#    system("mv $domain_name.key keys/"); # Ключ сертификата. Приватная информация, в отличие от самого файла сертификата
#    exit(0);
#}
 
# Хелп по вызову
if ($ARGV[0] =~ /--usage/)
{
    print STDOUT "\nЭтот скрипт автоматизирует процесс запроса, генерации и подписи сертификатов на основе самоподписанного корневого сертификата, который можно сгенерировать им же. Используйте вызов --prepare для того чтобы подготовить нужные файлы и папки для генерации, затем --ca для создания главного коренвого сертификата. После этого вы можете создать сертификат для каждого уникального домена (CommonName) с помощью опции --rs <domainname>";
    print STDOUT "\n";
    exit(0);
}
 
die
"Usage:\n
    --rs <DOMAIN>    Request and sign domain.crt using rootCA.crt created with --ca option or other way.\n
    --ca         Request and sign rootCA.crt - root certificate for signing other.\n
    --prepare    Create neccessary folders.\n
    --usage        Display text about how to use this scripit.\n
";
 
Типа так?:

Bash:
#!/usr/bin/bash

read -p 'Client name: ' client_name
read -p 'E-mail: ' email
read -p 'Password: ' password

set -e
#set -x # Debug

echo ''
openssl req -new -newkey rsa:1024 -nodes -keyout $client_name.key \
  -subj /C=RU/ST=Msk/L=Msk/O=Inc/OU=Web/CN=usr/emailAddress=$email \
  -out $client_name.csr

echo ''
openssl ca -config ca.config -in $client_name.csr -out $client_name.crt -batch

echo ''
openssl pkcs12 -export -in $client_name.crt -inkey $client_name.key \
  -certfile ca.crt -out $client_name.p12 -passout pass:$password

cp $client_name.p12 /tmp/
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх