Самоподписанный сертификат для сайта и субдоменов
Столкнулся с тем что нужен был самоподписанный сертификат. Такое бывает, например, тогда, когда кому-то httpS нужен для своих внутренних целей, например - только для админского доступа. Покупать ради этого сертификат просто нет смысла, но в то же время хочется быть всегда уверенным что это "правильный" сайт (и этот "служебный" httpS отображается в браузере без предупреждений). Странно, но хорошей инфы - "по пунктам" все сразу в одном месте не нашел.
Здесь будет описан такой вариант: корневой сертификат, который устанавливается через консоль в хранилище сертификатов Windows клиента, а для сайта (сервер Apache) - свой сертификат (и ключ), подписанный этим корневым.
Такая схема удобна тем, что установив на клиента(ов) один раз корневой сертификат можно потом для домена и субдоменов подключать новые сертификаты только на сервере, не затрагивая компьютеры клиентов каждый раз. Поскольку все сертификаты подписанные корневым сертификатом (раз установленным на клиенте), автоматически "признаются" браузером уже без предупреждений.
Порядок действий
- Создание корневого секретного ключа и корневого публичного сертификата
- Создание еще одного ключа - для сертификата сайта
- Создание файла запроса на подпись корневым сертификатом для сертификата сайта
- Подписывание корневым сертификатом (обработка запроса), в результате которого появляется сертификат для сайта
- Установка подписанного сертификата и ключа для сайта на сервер Apache
- Установка корневого сертификата в хранилище сертификатов Windows на компьютере клиента
Итак, необходимо сгенерировать две пары ключ-сертификат: корневую для клиентов и еще одну для сайта.
Устанавливать на клиента нужно сертификат из первой пары, а на сервер - и сертификат и ключ из второй пары.
Для последующих субдоменов достаточно каждый раз создавать пару ключ-сертификат для сайта и устанавливать на сервер.
Поскольку на клиенте стоит корневой сертификат которым каждая последующая пара будет подписана, то клиент каждый следующий сертификат сайта будет подхватывать автоматически.
Создание двух пар ключ-сертификат - корневой и для сайта
На сервере должен быть установлен openssl.
Перед началом нужно перейти в папку где будут храниться сертификаты
(например cd /etc/apache2/certs/
Корневые - ключ-сертификат:
Создание секретного корневого ключа: openssl genrsa -out Root_Secret.key 2048
Создание публичного корневого сертификата:
ВАЖНО! Все указанные команды выполняются в одну строку, без переносов!
Все будет без пароля доступа и сразу на 10 лет (3650 дней). Подробнее про все параметры (в т.ч. про алгоритм, битность ключа и пр.) - см. в документации параметры командной строки openssl.
ВАЖНО! Здесь выделено -subj "..."
-subj "..."
Для сайта - ключ-сертификат:
Сначала надо создать запрос на подпись, которая будет произведена с помощью сделанного только что ранее корневого сертификата. В идеале запрос посылают на подпись специальному центру сертификации (потому и запрос), но для самоподписанных... подписываешь сам.
Перед созданием запроса нужно создать "сайтовый" секретный ключ (а в результате подписи будет сгенерирован уже и "сайтовый" сертификат).
Создание секретного "сайтового" ключа: openssl genrsa -out SITE_Secret.key 2048
Запрос 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
Подписываем запрос корневым сертификатом (создается публичный сертификат сайта):
ВАЖНО! Все указанные команды выполняются в одну строку, без переносов!
Все будет без пароля доступа и сразу на 5 лет (1825 дней). Подробнее про все параметры (в т.ч. про алгоритм, битность ключа и пр.) - см. в документации параметры командной строки openssl.
ВАЖНО! Здесь выделено
Установка ключей и сертификатов на сервер и на сайт
Надо подключить "сайтовую" пару ключ-сертификат на сервере Apache для нужного сайта, но перед этим - один раз для всех сайтов установить публичный корневой сертификат на клиенте (клиентах) в хранилище сертификатов 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
Оставьте комментарий
Вы можете войти под своим логином или зарегистрироваться на сайте.