Files
security-alert-center/docs/ssl-certificate.md
T
PTah 6b288bfa49 chore(github): generic example.com in docs, remove mirror scripts
Replace sac.kalinamall.ru with sac.example.com in public docs/deploy.
Remove Push-Mirror and Rewrite-GitHostUrls scripts from repo.
Simplify workspace-three-repos.md for GitHub-only workflow.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-16 11:57:02 +10:00

12 KiB
Raw Blame History

TLS-сертификат для SAC (wildcard VeriSign / DigiCert)

Куда положить файлы, в каком формате, как скопировать на сервер sac.example.com.

Связано: install-ubuntu-24.04-native.md §9, шаблон deploy/nginx/sac.conf.tls.example.


1. Что должно получиться на сервере

nginx читает два PEM-файла (текст, начинается с -----BEGIN ...-----):

Путь на сервере Содержимое Кто читает
/etc/ssl/sac/fullchain.pem Сертификат сайта/wildcard + промежуточные CA (без корневого — обычно не нужен) nginx
/etc/ssl/sac/privkey.pem Закрытый ключ (RSA или EC) nginx

Имена файлов можно другие, если пути совпадают с ssl_certificate / ssl_certificate_key в /etc/nginx/sites-available/sac.

Покрытие имени: в сертификате должен быть CN или SAN вида *.example.com (wildcard) или sac.example.com.


2. Что вам могут выдать (входные форматы)

От УЦ / админа Расширения Что делать
Готовый PEM .pem, .crt + .key Собрать fullchain, скопировать на сервер
PKCS#12 .pfx, .p12 Распаковать в PEM (см. §4.3, на Ubuntu 24.04 нужен -legacy)
Отдельные файлы certificate.crt, ca-bundle.crt, private.key Склеить fullchain (см. §5)
Windows (MMC) экспорт .pfx Распаковать на ПК или сервере (§4)

nginx не понимает напрямую: .pfx, .p12, .der без конвертации.


3. Каталог и права на сервере

Выполнить один раз на SAC-сервере:

sudo mkdir -p /etc/ssl/sac
sudo chown root:ssl-cert /etc/ssl/sac
sudo chmod 750 /etc/ssl/sac

sudo groupadd -f ssl-cert
sudo usermod -aG ssl-cert www-data

Каталог root:ssl-cert 750, не root:root: иначе у www-data нет права x (зайти в каталог), даже если ключ 640 и root:ssl-cert.

После копирования файлов:

sudo chmod 644 /etc/ssl/sac/fullchain.pem
sudo chmod 640 /etc/ssl/sac/privkey.pem
sudo chown root:root /etc/ssl/sac/fullchain.pem
sudo chown root:ssl-cert /etc/ssl/sac/privkey.pem
sudo chown root:ssl-cert /etc/ssl/sac
sudo chmod 750 /etc/ssl/sac

sudo systemctl restart nginx

Группа ssl-cert нужна, чтобы nginx (www-data) читал ключ и обходил каталог. На Ubuntu в ssl-cert по умолчанию может быть только postgres — добавьте www-data (usermod выше).

Проверка:

id www-data   # в groups должна быть ssl-cert
sudo -u www-data test -x /etc/ssl/sac && echo "dir OK" || echo "dir FAIL"
sudo -u www-data test -r /etc/ssl/sac/fullchain.pem && echo "fullchain OK" || echo "fullchain FAIL"
sudo -u www-data test -r /etc/ssl/sac/privkey.pem && echo "key OK" || echo "key FAIL"

4. Копирование на сервер

Подставьте IP или hostname SAC-сервера вместо SAC_SERVER.
Команды scp выполняются на той машине, куда копируете (обычно на SAC-сервере — «забрать» файл с другого хоста).

4.1. С Linux / macOS (scp)

Если уже есть fullchain.pem и privkey.pem на ПК:

scp fullchain.pem privkey.pem deploy@SAC_SERVER:/tmp/

На сервере:

sudo mv /tmp/fullchain.pem /tmp/privkey.pem /etc/ssl/sac/
sudo chmod 644 /etc/ssl/sac/fullchain.pem
sudo chmod 640 /etc/ssl/sac/privkey.pem
sudo chown root:root /etc/ssl/sac/fullchain.pem
sudo chown root:ssl-cert /etc/ssl/sac/privkey.pem
sudo chown root:ssl-cert /etc/ssl/sac
sudo chmod 750 /etc/ssl/sac
sudo rm -f /tmp/fullchain.pem /tmp/privkey.pem

4.2. С Windows (PowerShell / pscp)

Файлы, например, в D:\Certs\example\:

scp D:\Certs\example\fullchain.pem deploy@SAC_SERVER:/tmp/
scp D:\Certs\example\privkey.pem deploy@SAC_SERVER:/tmp/

Дальше на сервере — те же sudo mv и chown, что в §4.1.

Если есть только wildcard.pfx:

scp D:\Certs\example\wildcard.pfx deploy@SAC_SERVER:/tmp/

Распаковка на сервере (§4.3).

4.3. Забрать файл с другого Linux-сервера (scp)

Выполнять на SAC-сервере (pull с хоста, где лежит PFX/PEM):

mkdir -p /tmp/certs

# один файл
scp user@certs-host.example.com:/path/to/wildcard_example_com.pfx /tmp/certs/

# несколько файлов
scp user@certs-host:/path/to/fullchain.pem user@certs-host:/path/to/privkey.pem /tmp/certs/

# нестандартный SSH-порт (у scp заглавная P)
scp -P 2222 user@certs-host:/path/to/wildcard_example_com.pfx /tmp/certs/

С другого сервера отдать на SAC (push — команда на сервере-источнике):

scp /path/to/wildcard_example_com.pfx deploy@<IP_SAC>:/tmp/certs/

Нужен SSH-доступ и право читать файл на источнике.

4.4. Распаковка .pfx / .p12 на сервере (Ubuntu 24.04)

На Ubuntu 24.04 стоит OpenSSL 3.x. Старые PFX от VeriSign/DigiCert часто используют RC2-40-CBC — без флага -legacy будет ошибка:

Algorithm (RC2-40-CBC : 0), Properties (), unsupported

Всегда добавляйте -legacy к openssl pkcs12:

sudo apt install -y openssl

sudo mkdir -p /tmp/certs
cd /tmp/certs
# замените имя PFX; Enter Import Password: — пароль от PFX (не sudo)

sudo openssl pkcs12 -legacy -in wildcard_example_com.pfx -nocerts -nodes \
  -out privkey.pem

sudo openssl pkcs12 -legacy -in wildcard_example_com.pfx -clcerts -nokeys \
  -out server.crt

sudo openssl pkcs12 -legacy -in wildcard_example_com.pfx -cacerts -nokeys \
  -out ca-chain.crt

# fullchain = сервер + промежуточные (порядок важен)
cat server.crt ca-chain.crt | sudo tee /etc/ssl/sac/fullchain.pem > /dev/null
sudo cp privkey.pem /etc/ssl/sac/privkey.pem
sudo chmod 644 /etc/ssl/sac/fullchain.pem
sudo chmod 640 /etc/ssl/sac/privkey.pem
sudo chown root:root /etc/ssl/sac/fullchain.pem
sudo chown root:ssl-cert /etc/ssl/sac/privkey.pem
sudo chown root:ssl-cert /etc/ssl/sac
sudo chmod 750 /etc/ssl/sac

# очистка временных файлов
sudo shred -u server.crt ca-chain.crt privkey.pem 2>/dev/null
sudo rm -f /tmp/certs/wildcard_example_com.pfx

Если -legacy недостаточно:

sudo openssl pkcs12 -provider legacy -provider default \
  -in wildcard_example_com.pfx -nocerts -nodes -out privkey.pem

Проверить содержимое PFX:

sudo openssl pkcs12 -legacy -in wildcard_example_com.pfx -info -noout

Пароль PFX вводится интерактивно (Enter Import Password). Не коммитьте PFX и ключ в git.


5. Сборка fullchain из отдельных .crt

Типичный набор от VeriSign / DigiCert:

  • star_example_com.crt — ваш wildcard
  • DigiCertCA.crt / intermediate.crt — промежуточный
  • (иногда) TrustedRoot.crt — корневой не добавляйте в fullchain для nginx
# на ПК или на сервере, в каталоге с исходниками:
cat star_example_com.crt intermediate.crt > fullchain.pem
# ключ переименовать:
cp private.key privkey.pem

Проверка порядка (первая строка сертификата — ваш сайт):

openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout | grep subject=

Скопировать fullchain.pem и privkey.pem на сервер (§4).


6. Проверка сертификата

На сервере:

# кому выдан, срок действия
sudo openssl x509 -in /etc/ssl/sac/fullchain.pem -noout -subject -issuer -dates

# wildcard / SAN
sudo openssl x509 -in /etc/ssl/sac/fullchain.pem -noout -ext subjectAltName

# ключ соответствует сертификату
CERT_MD5=$(sudo openssl x509 -in /etc/ssl/sac/fullchain.pem -noout -modulus | openssl md5)
KEY_MD5=$(sudo openssl rsa -in /etc/ssl/sac/privkey.pem -noout -modulus 2>/dev/null | openssl md5)
# для EC-ключа:
# KEY_MD5=$(sudo openssl pkey -in /etc/ssl/sac/privkey.pem -noout -modulus | openssl md5)
echo "cert $CERT_MD5"
echo "key  $KEY_MD5"
# хеши должны совпадать

7. Подключение в nginx

sudo cp /opt/security-alert-center/deploy/nginx/sac.conf.tls.example \
  /etc/nginx/sites-available/sac

В файле должны быть (по умолчанию в шаблоне):

ssl_certificate     /etc/ssl/sac/fullchain.pem;
ssl_certificate_key /etc/ssl/sac/privkey.pem;
sudo ln -sf /etc/nginx/sites-available/sac /etc/nginx/sites-enabled/sac
sudo nginx -t
sudo systemctl reload nginx
curl -sS https://sac.example.com/health | jq .

В приложении SAC (/opt/security-alert-center/config/sac-api.env):

SAC_PUBLIC_URL=https://sac.example.com

8. Обновление сертификата (продление)

  1. Получить новые файлы от УЦ.
  2. Заменить /etc/ssl/sac/fullchain.pem и при необходимости privkey.pem.
  3. sudo nginx -t && sudo systemctl reload nginx.
  4. Проверить срок: openssl x509 -in /etc/ssl/sac/fullchain.pem -noout -dates.

Перезапуск sac-api не обязателен — TLS терминируется на nginx.


9. Безопасность

  • Закрытый ключ только на сервере SAC, права 640, группа ssl-cert.
  • Не хранить PFX/ключ в репозитории, почте, мессенджерах.
  • После распаковки PFX удалить /tmp/*.pfx и промежуточные копии.

10. Устранение неполадок

Симптом Решение
RC2-40-CBC / unsupported при pkcs12 OpenSSL 3 на Ubuntu 24.04: добавить -legacy (см. §4.4)
mac verify failure Неверный пароль PFX
nginx: PEM_read_bio_X509_AUX() failed Неверный PEM, проверьте fullchain.pem текстом, нет ли .der без конвертации
key values mismatch Ключ не от этой пары сертификатов
test -r privkey.pem без вывода / key FAIL Каталог chown root:ssl-cert, 750; usermod -aG ssl-cert www-data; systemctl restart nginx
permission denied на key То же + chmod 640 на ключ; test -x /etc/ssl/sac
Браузер/агент не доверяет Неполная цепочка — добавьте intermediate в fullchain
certificate has expired Продлить у УЦ, заменить файлы