# PKI (Public Key Infrastructure)

> Настройка PKI на VyOS: создание CA, генерация X.509 сертификатов, CRL, сертификаты для VPN и HTTPS, Let's Encrypt для Yandex Cloud и VK Cloud

Source: https://opennix.org/docs/vyos/pki/vyos-pki/


PKI (Public Key Infrastructure) в VyOS - это централизованная система управления сертификатами, ключами и удостоверяющими центрами (Certificate Authority - CA). VyOS предоставляет встроенные инструменты для генерации, хранения и управления криптографическими материалами, используемыми в VPN, HTTPS, и других защищенных сервисах.

## Обзор

PKI в VyOS используется для:

- **VPN аутентификации**: IPsec, OpenVPN с сертификатами вместо PSK
- **HTTPS сервисов**: Защищенный web-интерфейс и REST API
- **Взаимная аутентификация**: mTLS для критичных сервисов
- **Централизованное управление**: Собственный CA для внутренней инфраструктуры
- **Certificate-based SSH**: SSH аутентификация с сертификатами

### Компоненты PKI

| Компонент | Описание | Использование |
|-----------|----------|---------------|
| **CA (Certificate Authority)** | Удостоверяющий центр | Подпись сертификатов |
| **Certificate** | Сертификат X.509 | Идентификация устройства/сервиса |
| **Private Key** | Приватный ключ | Шифрование и подпись |
| **Certificate Request (CSR)** | Запрос на сертификат | Получение сертификата от CA |
| **CRL (Certificate Revocation List)** | Список отозванных сертификатов | Проверка валидности |

### Типичный workflow

1. **Создание CA** (корневой или промежуточный)
2. **Генерация приватного ключа** для сервиса/устройства
3. **Создание CSR** (Certificate Signing Request)
4. **Подпись CSR** собственным CA или внешним
5. **Установка сертификата** в VyOS
6. **Конфигурация сервисов** для использования сертификата

## Базовая конфигурация

### Создание собственного CA

```bash
# Генерация приватного ключа для CA
generate pki ca install ca-internal

# Параметры CA (интерактивно):
# Country: RU
# State: Moscow
# Locality: Moscow
# Organization: My Company
# Common Name: My Company Root CA

# Проверка созданного CA
show pki ca ca-internal

commit
save
```

### Генерация сертификата для сервера

```bash
# Генерация приватного ключа и сертификата
generate pki certificate sign ca-internal install vyos-server

# Параметры:
# Common Name: vyos.example.com
# Subject Alternative Names (опционально): DNS:vyos.example.com,IP:192.168.1.1

# Проверка
show pki certificate vyos-server

commit
save
```

### Импорт существующего сертификата

```bash
# Импорт сертификата из файла
generate pki certificate import vyos-cert certificate-file /tmp/certificate.pem

# Импорт приватного ключа
generate pki key-pair import vyos-key private-key-file /tmp/private-key.pem

commit
save
```

### Использование Let's Encrypt

```bash
# Импорт Let's Encrypt сертификата
generate pki certificate import letsencrypt-vyos \
  certificate-file /etc/letsencrypt/live/vyos.example.com/fullchain.pem \
  private-key-file /etc/letsencrypt/live/vyos.example.com/privkey.pem

# Настройка HTTPS с Let's Encrypt
set service https certificates certificate letsencrypt-vyos

commit
save
```

## Расширенная конфигурация

### Создание иерархии CA (Root + Intermediate)

**Root CA**:

```bash
# Создание Root CA (офлайн, хранить в безопасном месте)
generate pki ca install root-ca

# Параметры:
# Common Name: My Company Root CA
# Key size: 4096
# Validity: 3650 days (10 лет)

commit
save
```

**Intermediate CA**:

```bash
# Создание Intermediate CA
generate pki ca sign root-ca install intermediate-ca

# Параметры:
# Common Name: My Company Intermediate CA
# Key size: 2048
# Validity: 1825 days (5 лет)

commit
save
```

**Подпись сертификатов Intermediate CA**:

```bash
# Сертификаты подписываются промежуточным CA
generate pki certificate sign intermediate-ca install server-cert

commit
save
```

### Генерация сертификата с SAN (Subject Alternative Names)

```bash
# Сертификат с множественными именами
generate pki certificate sign ca-internal install multi-san-cert

# При запросе SAN указать:
# DNS:vyos.example.com,DNS:router.example.com,IP:192.168.1.1,IP:10.0.0.1

commit
save
```

### Wildcard сертификат

```bash
# Wildcard сертификат для поддомена
generate pki certificate sign ca-internal install wildcard-cert

# Common Name: *.example.com
# Позволяет использовать для любого поддомена: router.example.com, vpn.example.com, etc.

commit
save
```

### Client сертификаты для VPN

```bash
# Сертификат для VPN клиента
generate pki certificate sign ca-internal install client-alice

# Параметры:
# Common Name: alice@example.com
# Extended Key Usage: clientAuth

# Экспорт для передачи клиенту
show pki certificate client-alice pem

commit
save
```

### Certificate Revocation List (CRL)

```bash
# Создание CRL для CA
generate pki crl ca-internal install crl-internal

# Отзыв сертификата
set pki ca ca-internal crl revoke client-alice

# Обновление CRL
generate pki crl ca-internal regenerate

commit
save
```

### Настройка сроков действия

```bash
# Генерация с кастомным сроком действия (365 дней)
generate pki certificate sign ca-internal install short-term-cert valid-days 365

commit
save
```

## Примеры конфигураций

### Пример 1: IPsec VPN с сертификатами

```bash
# Создание CA
generate pki ca install vpn-ca

# Сертификат для локального роутера
generate pki certificate sign vpn-ca install vyos-site-a

# Сертификат для удаленного роутера (экспортировать)
generate pki certificate sign vpn-ca install vyos-site-b

# IPsec конфигурация с сертификатами
set vpn ipsec authentication psk-secret 'fallback-psk'
set vpn ipsec esp-group ESP-VPN proposal 1 encryption aes256
set vpn ipsec esp-group ESP-VPN proposal 1 hash sha256

set vpn ipsec ike-group IKE-VPN key-exchange ikev2
set vpn ipsec ike-group IKE-VPN proposal 1 encryption aes256
set vpn ipsec ike-group IKE-VPN proposal 1 hash sha256

# Site-to-Site с сертификатами
set vpn ipsec site-to-site peer site-b authentication mode x509
set vpn ipsec site-to-site peer site-b authentication x509 ca-certificate vpn-ca
set vpn ipsec site-to-site peer site-b authentication x509 certificate vyos-site-a
set vpn ipsec site-to-site peer site-b ike-group IKE-VPN
set vpn ipsec site-to-site peer site-b local-address 203.0.113.1
set vpn ipsec site-to-site peer site-b remote-address 198.51.100.1
set vpn ipsec site-to-site peer site-b tunnel 0 esp-group ESP-VPN
set vpn ipsec site-to-site peer site-b tunnel 0 local prefix 192.168.1.0/24
set vpn ipsec site-to-site peer site-b tunnel 0 remote prefix 192.168.2.0/24

commit
save
```

### Пример 2: OpenVPN с CA и клиентскими сертификатами

```bash
# Создание CA для OpenVPN
generate pki ca install openvpn-ca

# Серверный сертификат
generate pki certificate sign openvpn-ca install openvpn-server

# Клиентские сертификаты
generate pki certificate sign openvpn-ca install client-user1
generate pki certificate sign openvpn-ca install client-user2

# DH parameters
generate pki dh install dh-2048 bits 2048

# OpenVPN сервер конфигурация
set interfaces openvpn vtun10 mode server
set interfaces openvpn vtun10 server subnet 10.8.0.0/24
set interfaces openvpn vtun10 tls ca-certificate openvpn-ca
set interfaces openvpn vtun10 tls certificate openvpn-server
set interfaces openvpn vtun10 tls dh-params dh-2048

commit
save

# Экспорт клиентского сертификата для пользователя
show pki ca openvpn-ca pem
show pki certificate client-user1 pem
show pki certificate client-user1 private key
```

### Пример 3: HTTPS с собственным CA

```bash
# Создание CA
generate pki ca install web-ca

# Сертификат для web-интерфейса с SAN
generate pki certificate sign web-ca install web-server

# При создании указать SAN:
# DNS:vyos.example.com,IP:192.168.1.1

# Настройка HTTPS
set service https certificates certificate web-server

# Restart HTTPS service
restart https

commit
save
```

### Пример 4: Корпоративный PKI с иерархией

```bash
# Root CA (создается один раз, хранится офлайн)
generate pki ca install company-root-ca
# CN: Company Name Root CA
# Validity: 7300 days (20 лет)

# Intermediate CA для серверов
generate pki ca sign company-root-ca install servers-ca
# CN: Company Name Servers CA
# Validity: 3650 days (10 лет)

# Intermediate CA для клиентов
generate pki ca sign company-root-ca install clients-ca
# CN: Company Name Clients CA
# Validity: 3650 days (10 лет)

# Серверные сертификаты подписываются servers-ca
generate pki certificate sign servers-ca install web-server
generate pki certificate sign servers-ca install vpn-server

# Клиентские сертификаты подписываются clients-ca
generate pki certificate sign clients-ca install client-alice
generate pki certificate sign clients-ca install client-bob

commit
save
```

### Пример 5: Let's Encrypt с автообновлением

```bash
# Установка certbot (на VyOS)
sudo apt-get update
sudo apt-get install certbot

# Получение сертификата (HTTP-01 challenge)
sudo certbot certonly --standalone \
  --preferred-challenges http \
  --email admin@example.com \
  --agree-tos \
  -d vyos.example.com

# Импорт в VyOS
generate pki certificate import letsencrypt-vyos \
  certificate-file /etc/letsencrypt/live/vyos.example.com/fullchain.pem \
  private-key-file /etc/letsencrypt/live/vyos.example.com/privkey.pem

# Настройка HTTPS
set service https certificates certificate letsencrypt-vyos

commit
save
```

Скрипт автообновления `/config/scripts/renew-letsencrypt.sh`:

```bash
#!/bin/bash

# Обновление сертификата
sudo certbot renew --quiet

# Проверка обновления
if [ $? -eq 0 ]; then
    # Переимпорт в VyOS
    /usr/libexec/vyos/op_mode/pki.py import certificate \
      letsencrypt-vyos \
      /etc/letsencrypt/live/vyos.example.com/fullchain.pem \
      /etc/letsencrypt/live/vyos.example.com/privkey.pem

    # Restart HTTPS
    sudo systemctl restart vyos-http-api-server

    logger -t letsencrypt "Certificate renewed successfully"
else
    logger -t letsencrypt -p user.err "Certificate renewal failed"
fi
```

Task Scheduler для автообновления:

```bash
set system task-scheduler task renew-letsencrypt interval '0 3 * * *'
set system task-scheduler task renew-letsencrypt executable path '/config/scripts/renew-letsencrypt.sh'
```

### Пример 6: Wildcard сертификат для множественных сервисов

```bash
# Создание CA
generate pki ca install internal-ca

# Wildcard сертификат
generate pki certificate sign internal-ca install wildcard-example-com
# CN: *.example.com

# Использование для различных сервисов
# HTTPS
set service https certificates certificate wildcard-example-com

# OpenVPN
set interfaces openvpn vtun0 tls certificate wildcard-example-com

commit
save
```

## Мониторинг и диагностика

### Просмотр сертификатов и CA

```bash
# Показать все CA
show pki ca

# Детали конкретного CA
show pki ca ca-internal

# Экспорт CA в PEM
show pki ca ca-internal pem

# Показать все сертификаты
show pki certificate

# Детали конкретного сертификата
show pki certificate vyos-server

# Экспорт сертификата
show pki certificate vyos-server pem

# Экспорт приватного ключа
show pki certificate vyos-server private key
```

### Проверка срока действия

```bash
# Проверка сертификата
show pki certificate vyos-server

# Вывод включает:
# - Issuer (кто выдал)
# - Subject (кому выдан)
# - Valid From / Valid To (срок действия)
# - Subject Alternative Names
```

### Верификация цепочки сертификатов

```bash
# Проверка, что сертификат подписан нужным CA
show pki certificate vyos-server

# Проверка через openssl (в shell)
openssl verify -CAfile ca.pem certificate.pem
```

### Тестирование HTTPS с сертификатом

```bash
# С клиента
curl -k https://192.168.1.1/
curl --cacert ca.crt https://vyos.example.com/

# Проверка деталей сертификата
openssl s_client -connect vyos.example.com:443 -showcerts
```

### Проверка IPsec с сертификатами

```bash
# Проверка конфигурации
show vpn ipsec sa

# Логи IPsec
show log vpn ipsec

# Детали сертификата в IPsec
sudo swanctl --list-certs
```

### Monitoring истечения сертификатов

Скрипт `/config/scripts/check-cert-expiry.sh`:

```bash
#!/bin/bash

ALERT_DAYS=30
CERTS="vyos-server openvpn-server"

for cert in $CERTS; do
    # Получение даты истечения
    EXPIRY=$(cli-shell-api showConfig pki certificate $cert | grep "Valid To" | awk '{print $3}')

    # Конвертация и проверка (упрощенно)
    # В production использовать полноценный парсинг дат

    # Если близко к истечению - отправить алерт
    # echo "Certificate $cert expires on $EXPIRY" | mail -s "Cert Expiry Alert" admin@example.com

    logger -t cert-monitor "Checked certificate $cert"
done
```

Task Scheduler:

```bash
set system task-scheduler task cert-monitor interval '0 0 * * *'
set system task-scheduler task cert-monitor executable path '/config/scripts/check-cert-expiry.sh'
```

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

### Проблема: Сертификат не валидируется

**Диагностика**:

```bash
# Проверка сертификата
show pki certificate vyos-server

# Проверка CA
show pki ca ca-internal

# Проверка через openssl
openssl x509 -in certificate.pem -text -noout
openssl verify -CAfile ca.pem certificate.pem
```

**Решение**:

```bash
# Убедиться, что сертификат подписан правильным CA
# Проверить цепочку: Certificate -> Intermediate CA -> Root CA

# Переподписать, если необходимо
generate pki certificate sign ca-internal install vyos-server

commit
save
```

### Проблема: IPsec не работает с сертификатами

**Диагностика**:

```bash
# Проверка конфигурации
show configuration vpn ipsec

# Логи
show log vpn ipsec | match certificate

# Детали
sudo swanctl --list-certs
sudo ipsec statusall
```

**Решение**:

```bash
# Убедиться, что CA и сертификат настроены
show pki ca vpn-ca
show pki certificate vyos-site-a

# Проверить IPsec конфигурацию
set vpn ipsec site-to-site peer site-b authentication mode x509
set vpn ipsec site-to-site peer site-b authentication x509 ca-certificate vpn-ca
set vpn ipsec site-to-site peer site-b authentication x509 certificate vyos-site-a

commit
save

# Restart IPsec
restart ipsec
```

### Проблема: HTTPS не использует новый сертификат

**Решение**:

```bash
# Проверить конфигурацию
show configuration service https certificates

# Установить сертификат
set service https certificates certificate new-cert

commit
save

# Restart HTTPS
restart https
```

### Проблема: Сертификат истек

**Решение**:

```bash
# Сгенерировать новый сертификат
generate pki certificate sign ca-internal install vyos-server-new

# Обновить конфигурацию сервисов
set service https certificates certificate vyos-server-new

# Удалить старый
delete pki certificate vyos-server

commit
save
```

### Проблема: Приватный ключ поврежден

**Решение**:

```bash
# Создать новую пару ключ-сертификат
generate pki certificate sign ca-internal install new-cert

# Обновить все ссылки на старый сертификат

commit
save
```

### Проблема: CA не доверяется клиентами

**Решение**:

Экспортировать CA и установить на клиентские системы:

```bash
# На VyOS
show pki ca ca-internal pem > company-ca.crt

# На Linux клиенте
sudo cp company-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

# На Windows
# Импортировать через certmgr.msc в "Trusted Root Certification Authorities"

# На macOS
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain company-ca.crt
```

## Лучшие практики

### 1. Иерархия CA

Используйте Root + Intermediate CA:

```bash
# Root CA - офлайн, долгий срок действия
# Intermediate CA - онлайн, подписывает сертификаты
```

### 2. Сроки действия

Разумные сроки:

```bash
# Root CA: 10-20 лет
# Intermediate CA: 5-10 лет
# Серверные сертификаты: 1-3 года
# Клиентские сертификаты: 1-2 года
```

### 3. Размер ключей

```bash
# CA: 4096 бит
# Серверные сертификаты: 2048 бит (баланс безопасность/производительность)
# Клиентские сертификаты: 2048 бит
```

### 4. Subject Alternative Names

Всегда используйте SAN для совместимости:

```bash
# CN: vyos.example.com
# SAN: DNS:vyos.example.com,DNS:router.example.com,IP:192.168.1.1
```

### 5. Защита приватных ключей

```bash
# Ограничьте доступ к конфигурации
sudo chmod 600 /config/config.boot

# Храните Root CA офлайн
# Используйте passphrase для критичных ключей (вне VyOS)
```

### 6. Certificate Revocation

Настройте CRL для отзыва:

```bash
set pki ca ca-internal crl revoke compromised-cert
generate pki crl ca-internal regenerate
```

### 7. Мониторинг истечения

Настройте автоматическую проверку:

```bash
set system task-scheduler task cert-monitor interval '0 0 * * *'
```

### 8. Документирование

Документируйте все сертификаты:

```bash
# /config/pki-inventory.txt
# vyos-server: CN=vyos.example.com, Expires: 2026-10-14, Used by: HTTPS
# openvpn-server: CN=vpn.example.com, Expires: 2026-10-14, Used by: OpenVPN
```

### 9. Резервное копирование

Резервное копирование PKI:

```bash
# Backup всех сертификатов и ключей
show pki ca > /config/backup/pki-ca-backup.txt
show pki certificate > /config/backup/pki-cert-backup.txt

# Регулярное копирование конфигурации
/opt/vyatta/sbin/vyatta-save-config.pl /config/backup/config.boot.$(date +%Y%m%d)
```

### 10. Тестирование перед production

Тестируйте сертификаты перед развертыванием:

```bash
# Проверка валидности
openssl verify -CAfile ca.pem certificate.pem

# Проверка сроков
openssl x509 -in certificate.pem -noout -dates

# Проверка SAN
openssl x509 -in certificate.pem -noout -text | grep "Subject Alternative Name" -A1
```

## Полезные команды

```bash
# Показать все CA
show pki ca

# Показать все сертификаты
show pki certificate

# Детали CA
show pki ca ca-internal

# Детали сертификата
show pki certificate vyos-server

# Экспорт CA в PEM
show pki ca ca-internal pem

# Экспорт сертификата
show pki certificate vyos-server pem

# Экспорт приватного ключа
show pki certificate vyos-server private key

# Генерация CA
generate pki ca install new-ca

# Генерация сертификата
generate pki certificate sign ca-internal install new-cert

# Импорт сертификата
generate pki certificate import cert-name certificate-file /path/to/cert.pem

# Импорт ключа
generate pki key-pair import key-name private-key-file /path/to/key.pem

# Конфигурация
show configuration pki

# OpenSSL команды для проверки
openssl x509 -in cert.pem -text -noout
openssl verify -CAfile ca.pem cert.pem
openssl s_client -connect host:443 -showcerts
```

## Интеграция с другими функциями

### PKI + IPsec VPN

```bash
set vpn ipsec site-to-site peer site-b authentication mode x509
set vpn ipsec site-to-site peer site-b authentication x509 ca-certificate vpn-ca
set vpn ipsec site-to-site peer site-b authentication x509 certificate site-a-cert
```

### PKI + OpenVPN

```bash
set interfaces openvpn vtun0 tls ca-certificate openvpn-ca
set interfaces openvpn vtun0 tls certificate server-cert
set interfaces openvpn vtun0 tls dh-params dh-2048
```

### PKI + HTTPS

```bash
set service https certificates certificate web-cert
```

### PKI + SSH (сертификаты)

```bash
# Использование SSH CA для аутентификации (расширенная настройка)
# Требует дополнительной конфигурации OpenSSH
```

## Заключение

PKI (Public Key Infrastructure) в VyOS обеспечивает централизованное управление сертификатами для всех защищенных сервисов. Встроенные инструменты позволяют создавать собственные CA, генерировать сертификаты, управлять жизненным циклом и интегрировать с внешними PKI системами.

Основные преимущества PKI в VyOS:
- Централизованное управление сертификатами
- Собственный CA для внутренней инфраструктуры
- Поддержка иерархии CA (Root + Intermediate)
- Интеграция с VPN (IPsec, OpenVPN)
- Let's Encrypt support
- Certificate Revocation Lists (CRL)

Рекомендации для production:
- Используйте иерархию CA (Root офлайн + Intermediate онлайн)
- Применяйте разумные сроки действия
- Используйте SAN для всех сертификатов
- Защищайте приватные ключи
- Настройте мониторинг истечения
- Документируйте все сертификаты
- Регулярно создавайте резервные копии
- Тестируйте перед production
- Используйте CRL для отзыва скомпрометированных сертификатов

PKI в VyOS предоставляет enterprise-grade управление сертификатами для построения безопасной инфраструктуры с certificate-based аутентификацией, исключая необходимость использования PSK (Pre-Shared Keys) и обеспечивая централизованный контроль над криптографическими материалами.

