Создание самоподписанного сертификата ssl валидного в браузере и ОС

Данная ситуация часто возникает у разработчиков сайтов, либо у тех кто разворачивает внутри локальной сети свои сервисы, которые требуют https. Чтобы решить данную проблему, нужно создать свой корневой сертификат. И добавить его в доверенные в хранилище ОС.

Очень в этом помог пост на stack overflow

И так, для генерации сертификатов понадобиться 3 файла

1. create_root_cert_and_key.sh - создает корневой сертификат

#!/usr/bin/env bash
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

2. create_certificate_for_domain.sh - создание сертификата для домена, на основе корневого

#!/usr/bin/env bash
    if [ -z "$1" ]
    then
      echo "Please supply a subdomain to create a certificate for";
      echo "e.g. www.mysite.com"
      exit;
    fi
    if [ ! -f rootCA.pem ]; then
      echo 'Please run "create_root_cert_and_key.sh" first, and try again!'
      exit;
    fi
    if [ ! -f v3.ext ]; then
      echo 'Please download the "v3.ext" file and try again!'
      exit;
    fi
    # Create a new private key if one doesnt exist, or use the xeisting one if it does
    if [ -f device.key ]; then
      KEY_OPT="-key"
    else
      KEY_OPT="-keyout"
    fi
    DOMAIN=$1
    COMMON_NAME=${2:-*.$1}
    SUBJECT="/C=CA/ST=None/L=NB/O=None/CN=$COMMON_NAME"
    NUM_OF_DAYS=825
    openssl req -new -newkey rsa:2048 -sha256 -nodes $KEY_OPT device.key -subj "$SUBJECT" -out device.csr
    cat v3.ext | sed s/%%DOMAIN%%/"$COMMON_NAME"/g > /tmp/__v3.ext
    openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days $NUM_OF_DAYS -sha256 -extfile /tmp/__v3.ext 
    # move output files to final filenames
    mv device.csr "$DOMAIN.csr"
    cp device.crt "$DOMAIN.crt"
    # remove temp file
    rm -f device.crt;
    echo 
    echo "###########################################################################"
    echo Done! 
    echo "###########################################################################"
    echo "To use these files on your server, simply copy both $DOMAIN.csr and"
    echo "device.key to your webserver, and use like so (if Apache, for example)"
    echo 
    echo "    SSLCertificateFile    /path_to_your_files/$DOMAIN.crt"
    echo "    SSLCertificateKeyFile /path_to_your_files/device.key"

3. v3.ext

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = %%DOMAIN%%


В начале создаем корневой сертификат (create_root_cert_and_key.sh), потом сертификат для домена create_certificate_for_domain.sh test.ru test.ru

Если при создании сертификата для домена указать домен 1 раз, то будет создан willcard сертификат (*.test.ru)

Теперь добавляем корневой сертификат в доверенные.

Windows (проверено на десятке):

  1. Запустить cmd
  2. Вызвать в консоли mmc
  3. Файл - Добавить или удалить оснастку
  4. В списке доступных оснасток выбрать "Сертификаты"
  5. Нажать "Добавить", "Готово" и "ОК"
  6. В левой панели появится оснастка "Сертификаты"
  7. Развернуть путь "Сертификаты" - "Доверенные корневые центры сертификации" - "Сертификаты"
  8. Правой кнопкой мыши на "Сертификаты" - "Все задачи" - "Импорт"
  9. "Далее" - Выбрать файл корневого сертификата сгенерированного скриптом ( create_root_cert_and_key.sh) rootCA.pem, только нужно его переименовать в rootCA.crt, иначе не будет отображаться в списке файлов
  10. "Далее" - Выбрать пункт "Поместить все сертификаты" в следующее хранилище
  11. Нажать "Обзор" - Поставить галку "Показать физические хранилища" - Выбрать "Доверенные корневые центры сертификации" - "ОК"
  12. "Далее" - появится окно предупреждение, что устанавливается неизвестный сертификат, соглашаемся и получаем окошко - импорт завершен

Теперь если перезапустить браузер, то тестовый сайт откроется уже без предупреждений и с валидным сертификатом.




Комментарии