Оглавление

На krivoshein.site у меня стоит не бесплатный Let’s Encrypt, а платный сертификат GlobalSign (AlphaSSL). Решение старое: захотелось нормальную цепочку, предсказуемый срок действия и минимум сюрпризов на старых устройствах. Сертификат давно истекал, поэтому я занялся продлением и заодно записал весь процесс — от панели FirstVDS до конфига Nginx на WordOps.

Ниже — практичный разбор без маркетинга: что именно я нажимал в панели, какие файлы пришли от GlobalSign и как я их разложил по серверу.

Где и как я продлевал сертификат

Сертификат для krivoshein.site у меня оформлен через панель FirstVDS. В разделе SSL-сертификатов у них довольно прямолинейный интерфейс: выбираешь домен, продлеваешь заказ, дальше начинается стандартная история с CSR и подтверждением домена.

CSR у меня уже был, а приватный ключ я храню на сервере, поэтому брать новый ключ не пришлось. В панели FirstVDS я заполнил данные владельца (ФИО, e-mail, телефон) и выбрал подтверждение домена через DNS TXT-запись. Для GlobalSign это классический вариант.

Подтверждение домена через DNS TXT

После оформления заказа панель FirstVDS выдала строку вида:

_globalsign-domain-verification=XXXXXXXXXXXX...

Эту запись нужно добавить в DNS для домена krivoshein.site. В моём случае DNS живёт у регистратора, так что всё свелось к добавлению TXT-записи в зону. Через некоторое время GlobalSign проверяет запись, домен подтверждается, и сертификат уходит на выпуск.

После выпуска в панели FirstVDS стали доступны файлы сертификата. Я скачал набор архивов и отдельный CSR, но нас интересует именно zip с готовыми сертификатами.

Что прислал GlobalSign: разбираем файлы

Из архива от FirstVDS/GlobalSign я получил набор файлов примерно следующего вида:

  • www_krivoshein_site.crt — основной сертификат для домена www.krivoshein.site (в SAN обычно и сам krivoshein.site);
  • GlobalSign GCC R6 AlphaSSL CA 2025.crt — промежуточный сертификат центра сертификации;
  • GlobalSign.crt — корневой сертификат GlobalSign;
  • www_krivoshein_site.p7b — PKCS#7-пакет с тем же содержимым, больше полезен для IIS/Windows.

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

-----BEGIN RSA PRIVATE KEY-----
...закрытый ключ...
-----END RSA PRIVATE KEY-----

Показывать его где-либо кроме сервера — плохая идея, так что в блоге он живёт только в виде заглушки.

Готовим директорию под сертификат на сервере

Сервер с krivoshein.site у меня крутится на WordOps, поверх Nginx. Чтобы не размазывать ключи и сертификаты по системе, я использую отдельную директорию для домена:

mkdir -p /etc/ssl/krivoshein.site
cd /etc/ssl/krivoshein.site

Сюда же я кладу приватный ключ:

nano /etc/ssl/krivoshein.site/www_krivoshein_site.key

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

chmod 600 /etc/ssl/krivoshein.site/www_krivoshein_site.key
chown root:root /etc/ssl/krivoshein.site/www_krivoshein_site.key

Дальше копирую на сервер zip с сертификатами из панели FirstVDS и распаковываю:

cd /etc/ssl/krivoshein.site
unzip /root/14836355.zip

В итоге в каталоге оказываются файлы GlobalSign GCC R6 AlphaSSL CA 2025.crt, GlobalSign.crt и www_krivoshein_site.crt плюс p7b.

Собираем fullchain и ca-bundle

Для Nginx обычно нужно два файла:

  • fullchain — основной сертификат плюс цепочка до корневого;
  • ca-bundle (для ssl_trusted_certificate) — цепочка CA, которую сервер использует для stapling и проверки.

Fullchain

Fullchain я собрал так:

cd /etc/ssl/krivoshein.site

cat www_krivoshein_site.crt \
    GlobalSign\ GCC\ R6\ AlphaSSL\ CA\ 2025.crt \
    > fullchain.crt

chmod 644 fullchain.crt
chown root:root fullchain.crt

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

CA bundle

Для ssl_trusted_certificate я сделал отдельный файл, куда сложил промежуточный и корневой сертификаты:

cat GlobalSign\ GCC\ R6\ AlphaSSL\ CA\ 2025.crt \
    GlobalSign.crt \
    > ca-bundle.crt

chmod 644 ca-bundle.crt
chown root:root ca-bundle.crt

Этот файл nginx использует, в частности, для OCSP stapling.

Проверяем, что ключ подходит к сертификату

Перед тем как трогать конфиг, я всегда проверяю, что приватный ключ действительно от этого сертификата, а не от прошлого набора. Делается это через сравнение модулей:

cd /etc/ssl/krivoshein.site

openssl x509 -noout -modulus -in www_krivoshein_site.crt | openssl md5
openssl rsa  -noout -modulus -in www_krivoshein_site.key | openssl md5

Если хэши совпали — пара ключ/сертификат корректная, можно двигаться дальше. Если нет — где-то перепутан ключ, и лучше остановиться и разобраться до того, как сервер уйдёт в ошибку.

Настройка Nginx/WordOps под новый сертификат

В WordOps SSL-конфиг для сайта у меня лежит в /var/www/krivoshein.site/conf/nginx/ssl.conf. В нём я указываю пути к только что собранным файлам:

listen 443 ssl;
listen [::]:443 ssl;

ssl_certificate         /etc/ssl/krivoshein.site/fullchain.crt;
ssl_certificate_key     /etc/ssl/krivoshein.site/www_krivoshein_site.key;
ssl_trusted_certificate /etc/ssl/krivoshein.site/ca-bundle.crt;

ssl_stapling on;
ssl_stapling_verify on;

HTTP/2 и HTTP/3 (QUIC) у меня тоже включены, но они просто используют те же пути к сертификатам.

Редирект с http на https реализован отдельным блоком на 80 порту:

server {
    listen 80;
    listen [::]:80;
    server_name krivoshein.site www.krivoshein.site;

    return 301 https://$host$request_uri;
}

Проверка конфига и перезагрузка nginx

После правки конфигов первым делом проверяю синтаксис:

nginx -t

Если выводит, что syntax is ok и test is successful, перезагружаю nginx:

systemctl reload nginx

На этом этапе сайт уже должен отдавать новый сертификат. Но я всегда дополнительно проверяю даты и цепочку через openssl с клиентской стороны:

openssl s_client -connect krivoshein.site:443 -servername krivoshein.site \
    </dev/null 2>/dev/null | openssl x509 -noout -dates -issuer -subject
Продление SSL-сертификата GlobalSign для krivoshein.site через FirstVDS и настройка в Nginx/WordOps

В моём случае результат показывает срок действия до января 2027 года и issuer GlobalSign GCC R6 AlphaSSL CA 2025 — значит, продление прошло успешно, и наружу уходит именно новый сертификат.

Продление SSL-сертификата GlobalSign для krivoshein.site через FirstVDS и настройка в Nginx/WordOps

Краткий чеклист продления SSL через FirstVDS

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

  • В панели FirstVDS продлить заказ SSL для krivoshein.site.
  • Выбрать подтверждение через DNS TXT, добавить запись _globalsign-domain-verification в зону домена, дождаться выпуска сертификата.
  • Скачать архив с сертификатами из панели FirstVDS.
  • На сервере в /etc/ssl/krivoshein.site:
    • убедиться, что там лежит приватный ключ www_krivoshein_site.key с правами 600;
    • распаковать архив, получить www_krivoshein_site.crt, GlobalSign GCC R6 AlphaSSL CA 2025.crt и GlobalSign.crt;
    • собрать fullchain.crt (сертификат + промежуточный CA);
    • собрать ca-bundle.crt (промежуточный + корневой CA);
    • проверить совпадение модулей у ключа и сертификата через openssl.
  • В ssl.conf nginx/WordOps прописать пути к fullchain.crt, ключу и ca-bundle.crt.
  • Сделать nginx -t и reload, проверить сертификат через openssl s_client.

Итог

Продление платного SSL-сертификата через FirstVDS в связке с Nginx и WordOps оказалось довольно прямолинейной задачей. Вся магия сводится к двум вещам: аккуратно обращаться с приватным ключом и правильно собрать цепочку сертификатов. Если не лениться проверять себя через openssl перед перезагрузкой nginx, процедура получается надёжной и вполне повторяемой — как раз то, что нужно для боевого блога вроде krivoshein.site.