Генерация самоподписанного сертификата по новым требованиям

Тема генерации самоподписных сертификатов (self-signed certificate) для WEB серверов не нова, но недавно произошло знаковое событие.

Корпорация Apple, в очередной раз, преподнесла сюрприз своим поклонникам и выдвинула дополнительные требования к сертификатам безопасности (cсылка на первоисточник).

Подобная забота заблокировала возможность доступа ко всем сайтам, на которых установлены сертификаты, не удовлетворяющие требованиям Apple: Your connection is not private: NET::ERR_CERT_INVALID.

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

Что нового в требованиях Apple

Новые требования Apple к TLS сертификатам распространяются на все сертификаты, сгенерированные после 1 июля 2019 года. Эти требования были введены с обновлениями систем iOS 13 и macOS 10.15.

Однако у нас часть серверов продолжают успешно работать с самоподписанными сертификатами, сгенерированными после 1 июля 2019… Поэтому, прежде всего, проверьте, что ваши сервера действительно стали недоступны из-за проблем с ранее сгенерированными сертификатами, прежде чем генерировать новые.

Из релиза Apple ясно, что новые сертификаты должны:

  • иметь размер не менее 2048 бит;
  • срок действия сертификата не должен превышать 825 дней;
  • при генерации сертификатов должен использоваться алгоритм хеширования семейства SHA-2;
  • в дополнение с CommonName, в сертификате должно указываться DNS имя сервера в расширении сертификата Subject Alternative Name;
  • сертификат должен содержать расширение ExtendedKeyUsage (EKU), содержащее идентификатор объекта id-kp-serverAuth.

Генерация self-signed сертификатов на MacOS

Пожалуй, самый простой способ сгенерировать самоподписанный сертификат, сделать это на MacOS.

Для этого необходимо вызвать программу Keychain (связка ключей) -> Certificate Assistant (Ассистент сертификации) -> Create a Certificate (Создать сертификат)…

Сгенерировать новый сертификат с типом SSL Server (SSL Сервер) и параметрами по умолчанию. В качестве имени сертификата необходимо указать полное имя (FQDN) вашего сервера.

После генерации сертификата его необходимо экспортировать на компьютер в формате .p12. В этом файле в зашифрованном виде будут сохранены как приватный ключ (private key), так и самоподписанный сертификат (self-signed certificate).


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

Для конвертации удобно использовать стандартную программу OpenSSL:

Обратите внимание, что в большинстве случаев удобно, чтобы полученный секретный ключ был сохранен без пароля.

После этого останется только подложить полученный ключ и сертификат в папки, прописанные в настройках WEB-сервера, и перезапустить его.

Генерация самоподписанного сертификата с помощью OpenSSL

Пожалуй, это один из самых распространенных способов генерации самоподписанных сертификатов непосредственно на сервере.

Для тех, кого не интересуют подробности генерации, приводим строку, которая выполнит автоматическую генерацию секретного ключа (private key) и самоподписанного сертификата (self-signed certificate) в текущем каталоге сервера.

Обратите внимание, что для корректной генерации Вам необходимо указать полное имя сервера (FQDN) в начале этой последовательности команд, изменив значение переменной HOSTNAME (подставить свое значение вместо YOUR_SERVER_NAME):

Теперь давайте разберем эту последовательность команд.

Во-первых, объявляется переменная HOSTNAME, содержащая имя вашего сервера:
HOSTNAME=’YOUR_SERVER_NAME’

Далее, основываясь на выводе утилиты openssl, находим и запоминаем путь к файлу конфигурации этой утилиты (можно пойти более сложным путем, но для большинства систем такой способ будет рабочим):
OPENCFG=`openssl version -a | sed -n ‘s#OPENSSLDIR: «\(.*\)»#\1#p’`/openssl.cnf

И, собственно, генерация ключа, с необходимыми нам параметрами:
openssl req – вызов OpenSSL на генерацию ключа и самоподписанного сертификата (PKCS#10 X.509 Certificate Signing Request)
-extensions «v3_ca_ext» – указываем необходимость использования новой секции vs_sa_ext, в который мы определим дополнительные параметры сертификата
-config < (cat $OPENCFG– указываем оригинальный файл конфигурации OpenSSL, который мы дополним новой секцией с требуемыми параметрами
<(printf "\n — дополняем файл конфигурации новой секцией
[ v3_ca_ext ] — имя секции
subjectAltName=DNS:$HOSTNAME — определяем subjectAltName
basicConstraints=critical,CA:TRUE — определяем basicConstraints
keyUsage=critical,cRLSign,digitalSignature,keyCertSign — определяем keyUsage
extendedKeyUsage=critical,serverAuth»)) — определяем extendedKeyUsage
-nodes — не шифровать полученный ключ
-new — запрос на генерацию нового ключа
-x509 — выводить сразу сертификат в формате x509, вместо запроса на сертификацию
-sha256 — тип и длина сертификата
-newkey rsa:4096 — генерация нового ключа указанного типа и длины
-keyout $HOSTNAME.key — файл, куда будет записан секретный ключ
-out $HOSTNAME.crt — файл, куда будет записан полученный самоподписанный сертификат
-days 730 — срок действия сертификата.

Типовые команды OpenSSL

Здесь мы приводим список типовых команд, которые наиболее часто используются при работе с утилитой OpenSSL при обслуживании WEB-серверов.

Генерация секретного ключа и запроса на сертификацию

Генерация нового секретного ключа (private key) и запроса на сертификацию (Certificate Signing Request) без учета последних требований Apple:

Генерация самоподписанного сертификата (self-signed certificate) без учета последних требований Apple:

Генерация запроса на сертификацию для существующего ключа

Генерация запроса на сертификацию на основе сертификата

Снятие пароля с секретного ключа

Получение информации с помощью OpenSSL

Проверка запроса на сертификацию (CSR — Certificate Signing Request)

Вывод информации о секретном ключе (private key)

Вывод информации о сертификате (certificate)

Проверка файла PKCS#12 (.pfx или .p12)

Сервисные команды

Получение контрольной суммы MD5, для проверки соответствия ключа, сертификата т запроса друг-другу

Проверка SSL подключения с получением сертификатов удаленного сервера

Преобразование форматов

DER (.crt .cer .der) => PEM

PEM => DER

Извлечение секретного ключа (private key) и сертификатов (certificates) из PKCS#12 файла (.pfx .p12)

С помощью ключей –nocerts и –nokeys можно извлечь только секретный ключ или сертификаты (соответственно)

Получение PKCS#12 (.pfx .p12) из PEM сертификата и секретного ключа