Страница 1 из 1

Генерирование самоподписанного сертификата SHA256

Добавлено: 03 май 2017 15:39, Ср
UncleFather

Задача:

Необходимо сгенерировать самоподписанный сертификат SHA256.

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

Почему SHA256? - Потому что хоть SHA1 - одна из наиболее популярных функций хеширования находится на грани исчезновения. Алгоритм SHA1 был разработан в далеком 1995 году, а его первые слабые стороны обнаружили в 2005-м - почти 10 лет назад. Расчеты, проведенные два года назад, показали, что возможности взлома SHA1 значительно возросли. В связи с этим еще в ноябре прошлого года (2013) Microsoft заявил о том, что начиная с 2016 года компания полностью откажется от поддержки сертификатов, основанных на SHA1.

Кроме того, Google заявила о том, что компания будет постепенно отказываться от поддержки SHA1 в новых версиях наиболее используемого браузера Chrome. В первую очередь это отразится на том, что веб-сайты, использующие SSL сертификаты с хешированием SHA1 и сроком действия, заканчивающемся в 2016 году и позже, будут отмечены в браузере как ненадежные.

Почему бы просто не сгенерировать сертификат в Windows 7 или в поздних версиях Windows командой

Код: Выделить всё

openssl req -newkey rsa:2048 -nodes -sha256 -keyout my.domain.ru.key -x509 -days 3650 -out my.domain.ru.crt

- Потому что, начиная с 58-й версии, Google Chrome при использовании SSL сочтет сайт ненадежным и будет выдавать ошибку NET::ERR_CERT_COMMON_NAME_INVALID [missing_subjectAltName] для самоподписанных сертификатов. Дело в том, что, начиная с 58-й версии, Chrome требует, чтобы SSL сертификаты использовали SAN (Subject Alternative Name) вместо устаревшего Common Name (CN), из-за прекращения поддержки CN.
Поэтому, если сертификат сайта имеет только атрибут CN, то такой сайт будет считаться ненадежным.


Решение:

Суммируя все вышеуказанные факторы, мы видим, что нам нужен самоподписанный сертификат SHA256 с заполненным полем SAN.

Создание такого сертификата хорошо описано в статье Fixing Chrome 58+ [missing_subjectAltName] with openssl when using self signed certificates.

Подкорректировав этот алгоритм для Windows, и, переведя на русский язык, получаем следующую последовательность шагов:

  1. Для генерации корневого сертификата создаем файл настроек set.txt. Вместо указанных здесь параметров, нужно подставить свои. Если назначение каких-то полей непонятно, смотрим справку команды openssl:

    содержимое файла

    Код: Выделить всё

    [req]
    default_bits = 2048
    prompt = no
    default_md = sha256
    req_extensions = req_ext
    distinguished_name = dn
    
    [ dn ]
    C=RU
    ST=Region
    L=City
    O=Organization
    OU=Organization unit
    emailAddress=address@domain.ru
    CN = root.ru
    
    [ req_ext ]
    subjectAltName = @alt_names
    
    [ alt_names ]
    DNS.1 = localhost
    DNS.2 = www.root.ru
    DNS.3 = root.ru
    Пример для manaeff.ru:

    Код: Выделить всё

    [req]
    default_bits = 2048
    prompt = no
    default_md = sha256
    req_extensions = req_ext
    distinguished_name = dn
    
    [ dn ]
    C=RU
    ST=South Ural
    L=Chelyabinsk
    O=Alexander A. Manaeff
    OU=Web site
    emailAddress=man@manaeff.ru
    CN = manaeff.ru
    
    [ req_ext ]
    subjectAltName = @alt_names
    
    [ alt_names ]
    DNS.1 = localhost
    DNS.2 = www.manaeff.ru
    DNS.3 = manaeff.ru
  2. Для генерации корневого сертификата создаем командный файл (скрипт) createRootCA.bat, подставляя свои параметры, со следующим содержанием:

    Спойлер

    Код: Выделить всё

    mkdir ssl
    openssl genrsa -des3 -out ssl\root.ru.key 2048
    openssl req -x509 -new -config set.txt -nodes -key ssl\root.ru.key -sha256 -days 700 -out ssl\root.ru.pem
    Пример для manaeff.ru:

    Код: Выделить всё

    mkdir ssl
    openssl genrsa -des3 -out ssl\manaeff.ru.key 2048
    openssl req -x509 -new -config set.txt -nodes -key ssl\manaeff.ru.key -sha256 -days 8000 -out ssl\manaeff.ru.pem
  3. Запускаем файл createRootCA.bat и в папке SSL получаем три файла с расширениями .key, .pem и .srl.

  4. С помощью оснастки консоли управления (MMC) «Сертификаты», полученный сертификат (файл с расширением .pem) импортируем в хранилище «Доверенные корневые сертификаты» текущего пользователя.

  5. Для генерации сертификата для сайта, создаем файл настроек server.csr.cnf. Вместо указанных здесь параметров, нужно подставить свои. Если назначение каких-то полей непонятно, смотрим справку команды openssl:

    содержимое файла

    Код: Выделить всё

    [req]
    default_bits = 2048
    prompt = no
    default_md = sha256
    distinguished_name = dn
    
    [dn]
    C=RU
    ST=Region
    L=City
    O=Organization
    OU=Organization unit
    emailAddress=address@domain.ru
    CN = site.root.ru
    
    Пример для manaeff.ru:

    Код: Выделить всё

    [req]
    default_bits = 2048
    prompt = no
    default_md = sha256
    distinguished_name = dn
    
    [dn]
    C=RU
    ST=South Ural
    L=Chelyabinsk
    O=Alexander A. Manaeff
    OU=Web site
    emailAddress=man@manaeff.ru
    CN = manaeff.ru
    
  6. Для создания сертификата версии X509 v3 (вместо v1, который создается по умолчанию, если не указан файл расширений), создаем файл расширений v3.ext. Вместо указанных здесь параметров, нужно подставить свои:

    содержимое файла

    Код: Выделить всё

    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = localhost
    DNS.2 = site.root.ru
    DNS.3 = www.site.root.ru
    
    Пример для manaeff.ru:

    Код: Выделить всё

    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = localhost
    DNS.2 = manaeff.ru
    DNS.3 = www.manaeff.ru
  7. Для генерации сертификата (дочернего сгенерированному на 3-ем шаге корневому root), который мы будем использовать для сайта, создаем командный файл (скрипт) createselfsignedcertificate.bat. Вместо указанных здесь параметров, нужно подставить свои. Если назначение каких-то полей непонятно, смотрим справку команды openssl:

    листинг скрипта

    Код: Выделить всё

    openssl req -new -sha256 -nodes -out site.root.ru.csr -newkey rsa:2048 -keyout site.root.ru.key -config server.csr.cnf
    
    openssl x509 -req -in site.root.ru.csr -CA ssl\root.ru.pem -CAkey ssl\root.ru.key -CAcreateserial -out site.root.ru.crt -days 365 -sha256 -extfile v3.ext
    Пример для manaeff.ru:

    Код: Выделить всё

    openssl req -new -sha256 -nodes -out manaeff.ru.csr -newkey rsa:2048 -keyout manaeff.ru.key -config server.csr.cnf
    
    openssl x509 -req -in manaeff.ru.csr -CA ssl\manaeff.ru.pem -CAkey ssl\manaeff.ru.key -CAcreateserial -out manaeff.ru.crt -days 7000 -sha256 -extfile v3.ext
  8. Запускаем файл createselfsignedcertificate.bat и получаем три файла с расширениями .key, .crt и .csr.

  9. Пользуемся сгенерированными сертификатами. И в Internet Explorer и в Google Chrome сайты, подписанные такими сертификатами будут отображаться как надежные (конечно, если установить на конечный компьютер в хранилище «Доверенные корневые сертификаты» текущего пользователя либо корневой сертификат либо сертификат сайта).

Чтобы внутри домена AD все компьютеры сразу доверяли новому сертификату, Генерируем сертификат SHA256, подписанный AD на Windows 2003.


Примечание 1:

Утилита openssl входит в стандартную поставку MS Windows 7 и выше (возможно, входит и в XP - не проверял).


Примечание 2:

Для распространения сертификатов на клиентских компьютерах в домене пользуемся доменными политиками, а за пределами домена, для этой цели можно создать скрипт. Как создавать такие скрипты читаем в статье Добавляем сертификат в корневые из командной строки