В этой заметке в деталях описывается процесс создания собственного Центра сертификации и последующая генерация сопутствующих файлов: сертификатов, запросов на сертификат и так далее. Считаем, что работаем в терминале на линукс/юникс машине с установленным openssl.
Заметка является вольным переложением на русский язык вот этой статьи.
Коротко о главном
Центр сертификации (по-английский Certification authority, сокращённо CA) — это единый центр генерации цифровых сертификатов. Конечные клиенты имеют публичный ключ и при помощи этого ключа проверяют выписанные CA сертификаты. Нас интересуют сертификаты, используемые в сеансах, защищённых протоколом SSL/TLS.
Собственно, всю процедуру можно разбить на такие шаги:
- генерим приватный ключ (сильно случайный набор байтов);
- генерим на основе приватного ключа пару сертификатов для CA (публичный и приватный);
- генерим пару сертификатов
Создаём CA
Для начала сгенерим приватный ключ (файл ca.key), в процессе вводим пароль (запоминаем его, нам он дальше понадобится):
$ openssl genrsa -des3 -out ca.key 4096
Теперь сгенерим пару сертификатов для нашего CA (вместо 365 можно подставить любое другое значение, это срок годности пары сертификатов):
$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Вводим пароль к ключу и затем аккуратно заполняем поля. По этим данным можно будет потом идентифицировать публичный сертификат среди списка других, например. На выходе получаем файл ca.crt — это публичный сертификат нашего CA.
Создаём пару сертификатов для домена
Итак, у нас есть некий домен (к примеру, regolit.com) и мы хотим выписать для него SSL-сертификат, подписанный только что созданным CA. Шаги примерно такие же, как и в случае создания CA: создаём приватный ключ (это ключ для нашего домена/сервера, не путайте его с ключом CA, для гарантии можно даже проделывать шаги по созданию CA в отдельном каталоге).
Итак, генерим ключ (вводим пароль, желательно другой, отличный от пароля, использованного для генерации ключа CA):
$ openssl genrsa -des3 -out server.key 4096
Приватный ключ хранится на стороне владельца сервера и не должен никогда никому отдаваться. Как же тогда CA сможет подписать сертификат? Очень просто, на основании ключа server.key генерится так называемый запрос на подпись сертификата (по-английски certificate signing request (csr)):
$ openssl req -new -key server.key -out server.csr
Очень важно корректно заполнить запрашиваемую информацию, конкретно имя домена, для которого выписывается сертификат, нужно указать в параметре Common name, примерно вот так:
Common Name (eg, YOUR name) []:regolit.com
Полученный файл server.csr теперь нужно «отправить» CA, чтобы там его подписали. Поскольку CA наш собственный, то прямо сейчас же и подпишем:
$ openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
В данном случае «срок годности» сертификата устанавливаем в 365 дней.
Теперь у нас есть практически полный комплект всех нужных сертификатов. Для сервера нужно только «вытащить» незашифрованный серверный ключ (в файл server.key.insecure):
$ openssl rsa -in server.key -out server.key.insecure
Для удобства использования можно немного переименовать файлы:
$ mv server.key server.key.secure
$ mv server.key.insecure server.key
Используем сертификаты
Для начала полезные команды, которые позволяет «посмотреть» сертификаты:
$ openssl rsa -noout -text -in server.key
$ openssl req -noout -text -in server.csr
$ openssl rsa -noout -text -in ca.key
$ openssl x509 -noout -text -in ca.crt
Теперь нужно положить сгенерированные сертификаты (server.crt и server.key) в нужное место на сервере. Конкретные детали уже выходят за рамки заметки.
Чтобы браузер не ругался на сертификат, нужно добавить в его репозиторий CA только что созданный CA, а именно файл ca.crt, импортируем, смотрим, что в списке он появился. Также можно сертификат положить в общесистемный репозиторий CA-сертификатов.