На смену истёкшему сертификату выпускают новый, а ключ сайта обычно оставляют прежним.
У сертификата есть пара — закрытый ключ. Сервер хранит его у себя: у nginx это /etc/nginx/tls/secure.key, читать его может только root. Ключом сервер в начале TLS доказывает, что сертификат его. Открытая половина ключа записана в самом сертификате.
Новый сертификат выпускают в два шага. Сначала на сервере создают запрос на сертификат, CSR: открытый ключ, subject и SAN, подписанные закрытым ключом. Потом CA проверяет запрос и выпускает по нему сертификат — со своим issuer, новым сроком и своей подписью. Для secure.lab.test это две команды; учебный CA лежит в ~/tls-lab, а в жизни его ключ хранят те, кто выпускает сертификаты:
-subj задаёт subject, -addext — SAN, -days — срок. -copy_extensions copy переносит SAN из запроса в сертификат.
Готовый файл nginx начнёт отдавать, когда перечитает конфигурацию: после замены файла — sudo systemctl reload nginx, а затем снова s_client или curl.
Ты подписал запрос без -copy_extensions copy, и openssl x509 -in new.crt -noout -ext subjectAltName печатает No extensions in certificate. Что сделаешь?
-
nginx отдаёт файл как есть. Имён нет в самом сертификате — reload их не добавит.
-
Ключ и запрос в порядке: SAN в запросе есть — его покажет
openssl req -in x.csr -noout -text. Имена не перенесла подпись. -
curl сверяет имя из адреса с SAN. Сертификат без SAN он отвергнет с
no alternative certificate subject name.
SAN — расширение запроса, и в сертификат оно попадает, только если подпись его переносит. Ключ и запрос остаются прежними, перевыпустить нужно только сертификат.
Главное в шаге
- Закрытый ключ остаётся на сервере, в сертификат попадает его открытая половина.
- Новый сертификат — это запрос CSR от прежнего ключа и подпись CA с новым сроком.
-
Новый файл nginx отдаёт после
systemctl reload nginx: проверяй то, что видит клиент.