Files

314 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TLS-сертификат для SAC (wildcard VeriSign / DigiCert)
Куда положить файлы, в каком формате, как скопировать на сервер `sac.kalinamall.ru`.
Связано: [install-ubuntu-24.04-native.md](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-сервере:
```bash
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`.
После копирования файлов:
```bash
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` выше).
Проверка:
```bash
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` на ПК:
```bash
scp fullchain.pem privkey.pem papatramp@SAC_SERVER:/tmp/
```
На сервере:
```bash
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\`:
```powershell
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`**:
```powershell
scp D:\Certs\kalinamall\wildcard.pfx papatramp@SAC_SERVER:/tmp/
```
Распаковка на **сервере** (§4.3).
### 4.3. Забрать файл с другого Linux-сервера (scp)
Выполнять **на SAC-сервере** (pull с хоста, где лежит PFX/PEM):
```bash
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 — команда на сервере-источнике):
```bash
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` будет ошибка:
```text
Algorithm (RC2-40-CBC : 0), Properties (), unsupported
```
**Всегда добавляйте `-legacy`** к `openssl pkcs12`:
```bash
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` недостаточно:
```bash
sudo openssl pkcs12 -provider legacy -provider default \
-in wildcard_kalinamall_ru.pfx -nocerts -nodes -out privkey.pem
```
Проверить содержимое PFX:
```bash
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` — ваш wildcard
- `DigiCertCA.crt` / `intermediate.crt` — промежуточный
- (иногда) `TrustedRoot.crt` — корневой **не** добавляйте в fullchain для nginx
```bash
# на ПК или на сервере, в каталоге с исходниками:
cat star_kalinamall_ru.crt intermediate.crt > fullchain.pem
# ключ переименовать:
cp private.key privkey.pem
```
Проверка порядка (первая строка сертификата — ваш сайт):
```bash
openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout | grep subject=
```
Скопировать `fullchain.pem` и `privkey.pem` на сервер (§4).
---
## 6. Проверка сертификата
На сервере:
```bash
# кому выдан, срок действия
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
```bash
sudo cp /opt/security-alert-center/deploy/nginx/sac.conf.tls.example \
/etc/nginx/sites-available/sac
```
В файле должны быть (по умолчанию в шаблоне):
```nginx
ssl_certificate /etc/ssl/sac/fullchain.pem;
ssl_certificate_key /etc/ssl/sac/privkey.pem;
```
```bash
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`):
```ini
SAC_PUBLIC_URL=https://sac.kalinamall.ru
```
---
## 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` | Продлить у УЦ, заменить файлы |