Чужой опыт экономит время и увеличивает шансы для удачи

Самоподписанный сертификат для сайта и субдоменов

Столкнулся с тем что нужен был самоподписанный сертификат. Такое бывает, например, тогда, когда кому-то httpS нужен для своих внутренних целей, например - только для админского доступа. Покупать ради этого сертификат просто нет смысла, но в то же время хочется быть всегда уверенным что это "правильный" сайт (и этот "служебный" httpS отображается в браузере без предупреждений). Странно, но хорошей инфы - "по пунктам" все сразу в одном месте не нашел.

Здесь будет описан такой вариант: корневой сертификат, который устанавливается через консоль в хранилище сертификатов Windows клиента, а для сайта (сервер Apache) - свой сертификат (и ключ), подписанный этим корневым.

Такая схема удобна тем, что установив на клиента(ов) один раз корневой сертификат можно потом для домена и субдоменов подключать новые сертификаты только на сервере, не затрагивая компьютеры клиентов каждый раз. Поскольку все сертификаты подписанные корневым сертификатом (раз установленным на клиенте), автоматически "признаются" браузером уже без предупреждений.



Самоподписанный сертификат для полноценной работы требует установки вручную на клиента

Порядок действий

  1. Создание корневого секретного ключа и корневого публичного сертификата
  2. Создание еще одного ключа - для сертификата сайта
  3. Создание файла запроса на подпись корневым сертификатом для сертификата сайта
  4. Подписывание корневым сертификатом (обработка запроса), в результате которого появляется сертификат для сайта
  5. Установка подписанного сертификата и ключа для сайта на сервер Apache
  6. Установка корневого сертификата в хранилище сертификатов Windows на компьютере клиента

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

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

Создание двух пар ключ-сертификат - корневой и для сайта

На сервере должен быть установлен openssl.

Перед началом нужно перейти в папку где будут храниться сертификаты
(например cd /etc/apache2/certs/ )

Корневые - ключ-сертификат:

Создание секретного корневого ключа:
openssl genrsa -out Root_Secret.key 2048

Создание публичного корневого сертификата:

openssl req -x509 -new -nodes -key Root_Secret.key -sha256 -days 3650 -subj "/emailAddress=admin@SITE.com/C=EU/ST=City/L=Loc/O=Org/OU=Org Unit/CN=My Org" -out Root_Public.crt

ВАЖНО! Все указанные команды выполняются в одну строку, без переносов!

Все будет без пароля доступа и сразу на 10 лет (3650 дней). Подробнее про все параметры (в т.ч. про алгоритм, битность ключа и пр.) - см. в документации параметры командной строки openssl.

ВАЖНО! Здесь выделено синим цветом то, что надо заменить своими параметрами.
-subj "..." использовано чтобы не отвечать на вопросы. Можно убрать -subj "..." и ответить на все вопросы вручную в консоли.

Root_Public.crt - корневой публичный сертификат, который надо установить на локального клиента!

Для сайта - ключ-сертификат:

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

Перед созданием запроса нужно создать "сайтовый" секретный ключ (а в результате подписи будет сгенерирован уже и "сайтовый" сертификат).

Создание секретного "сайтового" ключа:
openssl genrsa -out SITE_Secret.key 2048

Запрос CSR - на подпись корневым сертификатом:

openssl req -new -sha256 -nodes -key SITE_Secret.key -subj "/emailAddress=cert@SITE.com/C=EU/ST=City/L=Loc/O=Org/OU=Org Unit/CN=SITE.com" -out SITE_QUERY.csr

ВАЖНО! Все указанные команды выполняются в одну строку, без переносов!

ВАЖНО! Здесь выделено синим цветом то, что надо заменить своими параметрами.
-subj "..." использовано чтобы не отвечать на вопросы. Можно убрать -subj "..." и ответить на все вопросы вручную в консоли.

Создаем вспомогательный файл в котором укажем домен и субдомены:
nano param.ext

authorityKeyIdentifier=keyid,issuer

basicConstraints=CA:FALSE

keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment

subjectAltName = @alt_names


[alt_names]

DNS.1 = SITE.com

DNS.2 = *.SITE.com

Подписываем запрос корневым сертификатом (создается публичный сертификат сайта):

openssl x509 -req -in SITE_QUERY.csr -CA Root_Public.crt -CAkey Root_Secret.key -CAcreateserial -out SITE_Public.crt -sha256 -days 1825 -extfile param.ext

ВАЖНО! Все указанные команды выполняются в одну строку, без переносов!

Все будет без пароля доступа и сразу на 5 лет (1825 дней). Подробнее про все параметры (в т.ч. про алгоритм, битность ключа и пр.) - см. в документации параметры командной строки openssl.

ВАЖНО! Здесь выделено синим цветом то, что надо заменить своими параметрами.


Установка ключей и сертификатов на сервер и на сайт

Надо подключить "сайтовую" пару ключ-сертификат на сервере Apache для нужного сайта, но перед этим - один раз для всех сайтов установить публичный корневой сертификат на клиенте (клиентах) в хранилище сертификатов Windows.

Здесь для клиента рассмотрен только случай установки сертификата - в ОС Windows

Установка корневого публичного сертификата в хранилище на клиенте (Windows)

Для начала нужно скачать на локальный клиентский компьютер созданный ранее публичный файл корневого сертификата Root_Public.crt (а файл корневого ключа при этом нужно хранить в секрете!).

Можно установить корневой сертификат через браузер, - в настройках открыть хранилище сертификатов (в разделе настроек безопасности) и установить его в раздел "Доверенные корневые сертификаты". Но это будет работать только для текущего пользователя Windows, который может к тому же этот сертификат удалить, например, по неосторожности.

Поэтому лучше установить через mmc-консоль сразу для всех пользователей Windows (и тогда кнопка прямого удаления через настройки браузера должна стать недоступна).

Для этого запускаем командную строку Windows от имени Администратора, и выполняем команду:
mmc

В меню "Файл - Добавить или удалить оснастку" найти в списке "Сертификаты" и нажать "Добавить" (выбрать "Для учетной записи компьютера"). Далее "Готово" и "Ok".

Далее нужно раскрыть список и найти в нем "Доверенные корневые центры сертификации", раскрыть и кликнув на "Сертификаты" правой кнопкой, выбрать "Все задачи - Импорт". После чего найти скачанный ранее публичный файл корневого сертификата и импортировать.

Может понадобиться перезапустить браузер, после чего все сертификаты сайтов и субдоменов подписанные этим корневым сертификатом должны отображаться в браузере корректно - без предупреждений. А например в Chrome нажав на иконку вначале строки адреса, можно увидеть "Сертификат (действительный)" и кликнув на эту строку посмотреть иерархию сертификатов: корневой-"сайтовый". Но чтобы это все заработало нужно сначала подключить так же и "сайтовый" сертификат (+ ключ) на сервере.

Установка для сайта пары ключ-сертификат на Apache

Это может быть примерно так:
/etc/apache2/sites-enabled/SITE-ssl :

<IfModule mod_ssl.c>

<VirtualHost SITE.com:443>

...

SSLCertificateFile /etc/apache2/certs/SITE_Public.crt

SSLCertificateKeyFile /etc/apache2/certs/SITE_Secret.key

...

</VirtualHost>

</IfModule>

ВАЖНО! Здесь выделено синим цветом то, что нужно заменить своими параметрами.

Важно по окончании не забыть перезапустить Apache:
/etc/init.d/apache2 restart




Рекламные ссылки:

Вопросы по теме статьи (просьба - без личностей), - присутствует премодерация:
   - регистрироваться НЕ обязательно! -

Комментарий будет опубликован только после проверки

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)