chore(home): mirror from kalinamall (9883e6a) with papatramp URLs
This commit is contained in:
@@ -0,0 +1,313 @@
|
||||
# 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` | Продлить у УЦ, заменить файлы |
|
||||
Reference in New Issue
Block a user