12 KiB
TLS-сертификат для SAC (wildcard VeriSign / DigiCert)
Куда положить файлы, в каком формате, как скопировать на сервер sac.kalinamall.ru.
Связано: 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 вида *.kalinamall.ru (wildcard) или sac.kalinamall.ru.
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 papatramp@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\kalinamall\:
scp D:\Certs\kalinamall\fullchain.pem papatramp@SAC_SERVER:/tmp/
scp D:\Certs\kalinamall\privkey.pem papatramp@SAC_SERVER:/tmp/
Дальше на сервере — те же sudo mv и chown, что в §4.1.
Если есть только wildcard.pfx:
scp D:\Certs\kalinamall\wildcard.pfx papatramp@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_kalinamall_ru.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_kalinamall_ru.pfx /tmp/certs/
С другого сервера отдать на SAC (push — команда на сервере-источнике):
scp /path/to/wildcard_kalinamall_ru.pfx papatramp@<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_kalinamall_ru.pfx -nocerts -nodes \
-out privkey.pem
sudo openssl pkcs12 -legacy -in wildcard_kalinamall_ru.pfx -clcerts -nokeys \
-out server.crt
sudo openssl pkcs12 -legacy -in wildcard_kalinamall_ru.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_kalinamall_ru.pfx
Если -legacy недостаточно:
sudo openssl pkcs12 -provider legacy -provider default \
-in wildcard_kalinamall_ru.pfx -nocerts -nodes -out privkey.pem
Проверить содержимое PFX:
sudo openssl pkcs12 -legacy -in wildcard_kalinamall_ru.pfx -info -noout
Пароль PFX вводится интерактивно (Enter Import Password). Не коммитьте PFX и ключ в git.
5. Сборка fullchain из отдельных .crt
Типичный набор от VeriSign / DigiCert:
star_kalinamall_ru.crt— ваш wildcardDigiCertCA.crt/intermediate.crt— промежуточный- (иногда)
TrustedRoot.crt— корневой не добавляйте в fullchain для nginx
# на ПК или на сервере, в каталоге с исходниками:
cat star_kalinamall_ru.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.kalinamall.ru/health | jq .
В приложении SAC (/opt/security-alert-center/config/sac-api.env):
SAC_PUBLIC_URL=https://sac.kalinamall.ru
8. Обновление сертификата (продление)
- Получить новые файлы от УЦ.
- Заменить
/etc/ssl/sac/fullchain.pemи при необходимостиprivkey.pem. sudo nginx -t && sudo systemctl reload nginx.- Проверить срок:
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 |
Продлить у УЦ, заменить файлы |