> For the complete documentation index, see [llms.txt](https://utm-1.gitbook.io/utm-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://utm-1.gitbook.io/utm-docs/dokumentaciya/utm-it/resheniya/organizaciya-dostupov/spravochnaya-informaciya/keycloak/instrukcii-po-razvertyvaniyu/razvyortyvanie-keycloak-v-k8s-alisa-ai/nastroika-obratnogo-proksi-dlya-keycloak.md).

# Настройка обратного прокси для Keycloak

#### Полная инструкция по настройке обратного прокси для Keycloak (NGINX + cert‑manager)

**Цель**: организовать защищённый доступ к Keycloak через HTTPS с валидным сертификатом Let’s Encrypt и проверкой SSL‑соединения между прокси и бэкендом.

***

### Шаг 1. Убедитесь в готовности инфраструктуры

Проверьте:

1. **cert‑manager установлен** в Kubernetes:

   bash

   ```bash
   kubectl get pods -n cert-manager
   ```
2. **ClusterIssuer настроен** и готов (`letsencrypt-prod`):

   bash

   ```bash
   kubectl get clusterissuer letsencrypt-prod -n cert-manager
   # Статус: Ready=True
   ```
3. **Keycloak доступен** по IP/порту (`192.168.1.100:31443`) и работает по HTTPS.

***

### Шаг 2. Создайте Certificate для домена

Файл `keycloak-certificate.yaml`:

yaml

```yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: keycloak-cert
  namespace: keycloak
spec:
  secretName: keycloak-tls
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  commonName: keycloak.utmsoft.ru
  dnsNames:
    - keycloak.utmsoft.ru
```

Выполните:

bash

```bash
kubectl apply -f keycloak-certificate.yaml
```

Проверьте статус:

bash

```bash
kubectl get certificate keycloak-cert -n keycloak
# Должен быть Ready=True
```

***

### Шаг 3. Получите цепочку сертификатов (ca‑bundle.crt)

**Вариант A. Из секрета (если есть ca.crt)**:

bash

```bash
kubectl get secret keycloak-tls -n keycloak -o jsonpath='{.data.ca\.crt}' | base64 -d > /etc/nginx/ssl/ca-bundle.crt
```

**Вариант B. Из tls.crt (если ca.crt отсутствует)**:

bash

```bash
kubectl get secret keycloak-tls -n keycloak -o jsonpath='{.data.tls\.crt}' | base64 -d > /etc/nginx/ssl/ca-bundle.crt
```

**Вариант C. Вручную через openssl** (рекомендуется для проверки):

bash

```bash
openssl s_client -connect keycloak.utmsoft.ru:443 -showcerts </dev/null 2>/dev/null \
  | openssl x509 -outform PEM > /etc/nginx/ssl/ca-bundle.crt
```

Установите права:

bash

```bash
chmod 644 /etc/nginx/ssl/ca-bundle.crt
```

***

### Шаг 4. Настройте NGINX

Файл `/etc/nginx/conf.d/keycloak.conf`:

nginx

```nginx
server {
    listen 80;
    server_name keycloak.utmsoft.ru;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name keycloak.utmsoft.ru;

    # Сертификаты для домена
    ssl_certificate /etc/letsencrypt/live/utmsoft.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/utmsoft.ru/privkey.pem;


    # Безопасные настройки SSL
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve secp384r1;
    ssl_session_timeout 10m;
    ssl_session_cache shared:SSL:10m;
    ssl_stapling on;
    ssl_stapling_verify on;

    # Защита от атак
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    add_header X-Frame-Options DENY always;
    add_header X-Content-Type-Options nosniff always;
    add_header X-XSS-Protection "1; mode=block" always;

    location / {
        # Проксирование на Keycloak через HTTPS
        proxy_pass https://192.168.1.100:31443;

        # Проверка SSL-сертификата бэкенда
        proxy_ssl_verify on;
        proxy_ssl_trusted_certificate /etc/nginx/ssl/ca-bundle.crt;
        proxy_ssl_name $host;
        proxy_ssl_server_name on;

        # Заголовки для прокси
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Host $host;


        # Таймауты
        proxy_connect_timeout 30s;
        proxy_read_timeout 60s;
        proxy_send_timeout 30s;

        # Буферизация
        proxy_buffer_size 4k;
        proxy_buffers 8 16k;
        proxy_busy_buffers_size 32k;
    }

    # Обработка ошибок
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}
```

***

### Шаг 5. Проверьте конфигурацию и перезапустите NGINX

1. Проверка синтаксиса:

   bash

   ```bash
   nginx -t
   ```
2. Перезагрузка:

   bash

   ```bash
   systemctl reload nginx
   ```

***

### Шаг 6. Проверьте работоспособность

1. **Доступ через браузер**:
   * Откройте `https://keycloak.utmsoft.ru`.
   * Убедитесь, что замок зелёный (валидный сертификат).
   * Попробуйте войти в админ‑панель (`/auth/admin`).
2. **Проверка через curl**:

   bash

   ```bash
   curl -vI https://keycloak.utmsoft.ru
   # Должен вернуть HTTP/2 200
   ```
3. **Логи NGINX**:

   bash

   ```bash
   tail -f /var/log/nginx/error.log
   ```

   Ошибки SSL будут видны здесь.
4. **Проверка цепочки сертификатов**:

   bash

   ```bash
   openssl verify -CAfile /etc/nginx/ssl/ca-bundle.crt \
     /etc/letsencrypt/live/utmsoft.ru/fullchain.pem
   # Вывод: OK
   ```

***

### Шаг 7. Автоматизация обновлений

1. **Для cert‑manager**:
   * Сертификаты обновляются автоматически каждые 60 дней.
   * NGINX не требует перезапуска (использует файлы на диске).
2. **Для ca‑bundle.crt**:
   * Если цепочка обновляется, скопируйте новый `ca.crt` из секрета:

     bash

     ```bash
     kubectl get secret keycloak-tls -n keycloak -o jsonpath='{.data.ca\.crt}' \
       | base64 -d > /etc/nginx/ssl/ca-bundle.crt
     ```
   * Перезагрузите NGINX: `systemctl reload nginx`.

***

### Возможные проблемы и их решение

1. **«SSL certificate problem»** в логах NGINX
   * Проверьте путь к `ca-bundle.crt`.
   * Убедитесь, что файл содержит полную цепочку.
2. **«502 Bad Gateway»**
   * Проверьте доступность бэкенда: `curl -kI https://192.168.1.100:31443`.
   * Убедитесь, что Keycloak слушает на указанном порту.
3. **«400 Bad Request»**
   * Проверьте заголовки `proxy_set_header` в конфигурации.
4. **«Let’s Encrypt rate limits»**
   * При частых перезапросах сертификатов используйте staging‑сервер Let’s Encrypt.

***

**Итог**:

* NGINX перенаправляет HTTP → HTTPS.
* SSL‑соединение между NGINX и Keycloak защищено (проверка сертификата бэкенда).
* Сертификаты обновляются автоматически.
* Добавлены меры безопасности (HSTS
