HTTPS: сертификат компании
Эта инструкция — для администратора, который уже установил Portal и хочет открывать его по имени компании с уже выпущенным SSL-сертификатом.
Portal сертификат не выпускает и в удостоверяющий центр не обращается. Вы подставляете свой файл: корпоративного УЦ или публичного (GlobalSign, Let’s Encrypt и т.п.).
Читайте сверху вниз. Сначала подготовьте файлы, затем откройте раздел своего канала.
0. Что понадобится
Заголовок раздела «0. Что понадобится»| Что | Зачем |
|---|---|
Имя сайта, например portal.company.ru | Его открывают сотрудники. Оно же — в поле portal.domain |
| Сертификат и закрытый ключ | Сайт отдаёт их браузеру |
| DNS | Имя указывает на сервер Portal или на Ingress |
| Порт 443 | Открыт до места, где заканчивается HTTPS |
Имя в сертификате (SAN или CN) совпадает с адресом в браузере. Сертификат на portal.company.ru не подойдёт для portal.local.
В portal.config.yaml:
portal: domain: portal.company.ru httpsPort: 443Установщик из domain собирает PORTAL_CORS_ORIGINS (https://portal.company.ru и http://…). Если домен поменяли после установки, поправьте PORTAL_CORS_ORIGINS в .env (Docker) или в /etc/portal/portal.env / C:\ProgramData\Portal\portal.env (Native) и перезапустите API.
Для ссылок в письмах (согласования и похожие сценарии) задайте публичный адрес:
PORTAL_PUBLIC_URL=https://portal.company.ruТа же переменная — в .env или portal.env, затем перезапуск API.
1. Подготовьте файлы
Заголовок раздела «1. Подготовьте файлы»Nginx в поставке Docker и Native Linux ждёт PEM с фиксированными именами:
| Файл | Содержимое |
|---|---|
cert.pem | Сертификат сайта, затем промежуточные сертификаты УЦ (цепочка, full chain) |
key.pem | Закрытый ключ без пароля |
Если цепочка пришла отдельным файлом, склейте её с сертификатом сайта:
cat portal.crt intermediate.crt > cert.pemЕсли пришёл контейнер PKCS#12 (.pfx / .p12):
openssl pkcs12 -in company.pfx -clcerts -nokeys -out cert.pemopenssl pkcs12 -in company.pfx -nocerts -nodes -out key.pemПроверка, что в сертификате нужное имя и срок не вышел:
openssl x509 -in cert.pem -noout -subject -ext subjectAltName -datesНа Windows IIS удобнее импортировать сам .pfx (см. §6). Конвертация в PEM нужна для nginx.
2. Куда класть сертификат
Заголовок раздела «2. Куда класть сертификат»| Канал | Где заканчивается HTTPS |
|---|---|
| Docker | nginx контейнера frontend, порт 443 |
| Kubernetes | Ingress, секрет TLS |
| Native Linux | nginx на хосте, файл /etc/nginx/sites-available/portal |
| Native Windows | привязка HTTPS сайта IIS Portal |
| Уже стоит на корпоративном шлюзе | шлюз отдаёт сертификат сотрудникам — §7 |
Штатный nginx Portal подставляет заголовок X-Forwarded-Proto из схемы своего входящего соединения. Когда сотрудники открывают https://… прямо на этом nginx, на Ingress или на IIS, API видит HTTPS и ставит cookie входа с флагом Secure.
3. Docker
Заголовок раздела «3. Docker»Контейнер frontend читает /etc/nginx/ssl/cert.pem и key.pem. Каталог на хосте задаётся переменной PORTAL_TLS_CERT_DIR в .env. Если при старте файлов нет, контейнер создаёт самоподписанный сертификат на 10 лет. Положите файлы компании в каталог до пересоздания контейнера.
Шаг 3.1. Каталог с сертификатом
Заголовок раздела «Шаг 3.1. Каталог с сертификатом»sudo mkdir -p /etc/portal/tlssudo cp cert.pem key.pem /etc/portal/tls/sudo chown root:root /etc/portal/tls/cert.pem /etc/portal/tls/key.pemsudo chmod 644 /etc/portal/tls/cert.pemsudo chmod 600 /etc/portal/tls/key.pemПроцесс nginx в контейнере стартует от root и должен читать ключ.
Шаг 3.2. Переменная в .env
Заголовок раздела «Шаг 3.2. Переменная в .env»В каталоге bundle, рядом с docker-compose.yml, откройте .env и задайте абсолютный каталог на хосте:
PORTAL_TLS_CERT_DIR=/etc/portal/tlsЕсли строки ещё нет — добавьте её. Внутри каталога уже лежат cert.pem и key.pem.
Шаг 3.3. Пересоздайте frontend
Заголовок раздела «Шаг 3.3. Пересоздайте frontend»docker compose --env-file .env up -d --force-recreate frontendКак проверить:
echo | openssl s_client -connect portal.company.ru:443 -servername portal.company.ru 2>/dev/null \ | openssl x509 -noout -subject -issuer -datesВ subject — имя компании, issuer — ваш УЦ, а не временный самоподписанный сертификат.
Пока PORTAL_TLS_CERT_DIR не задан, compose монтирует том portal_tls_certs. После смены переменной и --force-recreate контейнер берёт каталог с хоста.
Замена сертификата позже: перезапишите cert.pem и key.pem и снова выполните команду из шага 3.3.
4. Kubernetes
Заголовок раздела «4. Kubernetes»HTTPS завершается на Ingress. В под frontend сертификат класть не нужно: Service frontend слушает порт 80 внутри кластера.
Шаг 4.1. Секрет из PEM
Заголовок раздела «Шаг 4.1. Секрет из PEM»kubectl create secret tls portal-tls \ --cert=cert.pem \ --key=key.pem \ -n portalcert.pem здесь — сертификат сайта и промежуточная цепочка одним файлом.
Шаг 4.2. Values
Заголовок раздела «Шаг 4.2. Values»В portal-values.generated.yaml (или в своём -f):
ingress: host: portal.company.ru tls: enabled: true secretName: portal-tlsДля Portal Office на отдельном имени — второй секрет и второй Ingress:
kubectl create secret tls office-tls \ --cert=office-cert.pem \ --key=office-key.pem \ -n portaloffice: ingress: host: office.company.ru tls: enabled: true secretName: office-tlsШаг 4.3. Примените chart
Заголовок раздела «Шаг 4.3. Примените chart»helm upgrade portal ./helm/portal \ -n portal \ -f portal-values.generated.yamlПуть к chart — из вашего bundle (ls helm/).
Как проверить:
kubectl get ingress -n portalecho | openssl s_client -connect portal.company.ru:443 -servername portal.company.ru 2>/dev/null \ | openssl x509 -noout -subject -issuer -datesЗамена сертификата: удалите секрет и создайте заново с теми же именем и namespace (kubectl delete secret portal-tls -n portal, затем команда из шага 4.1). Ingress Controller подхватывает секрет без перезапуска подов Portal.
DNS: portal.company.ru (и office.company.ru, если включён Office) смотрит на IP Ingress. См. также Быстрый старт: Kubernetes.
5. Native Linux
Заголовок раздела «5. Native Linux»Установщик кладёт vhost в /etc/nginx/sites-available/portal. В поставке он слушает порт 80. Сертификат добавляется в тот же блок server: так сохраняются location для API, WebDAV и загрузок.
Шаг 5.1. Файлы
Заголовок раздела «Шаг 5.1. Файлы»sudo mkdir -p /etc/portal/tlssudo cp cert.pem key.pem /etc/portal/tls/sudo chown root:root /etc/portal/tls/cert.pem /etc/portal/tls/key.pemsudo chmod 644 /etc/portal/tls/cert.pemsudo chmod 600 /etc/portal/tls/key.pemШаг 5.2. Vhost
Заголовок раздела «Шаг 5.2. Vhost»Откройте /etc/nginx/sites-available/portal и сразу после listen 80; добавьте:
listen 443 ssl;ssl_certificate /etc/portal/tls/cert.pem;ssl_certificate_key /etc/portal/tls/key.pem;ssl_protocols TLSv1.2 TLSv1.3;server_name оставьте равным portal.domain (установщик подставляет его вместо PORTAL_DOMAIN_PLACEHOLDER).
Шаг 5.3. Перезагрузка nginx
Заголовок раздела «Шаг 5.3. Перезагрузка nginx»sudo nginx -tsudo systemctl reload nginxКак проверить: openssl s_client из §3.3 и вход в браузере по https://portal.company.ru.
Замена сертификата: перезапишите PEM и снова sudo systemctl reload nginx.
6. Native Windows
Заголовок раздела «6. Native Windows»Сайт IIS Portal после установки слушает порт 80. Сертификат привязывается к этому сайту.
Шаг 6.1. Импорт
Заголовок раздела «Шаг 6.1. Импорт»- Диспетчер IIS → имя сервера → Server Certificates.
- Import… и укажите
.pfxкомпании (нужен пароль контейнера). - Сертификат появляется в списке с закрытым ключом.
Шаг 6.2. Привязка HTTPS
Заголовок раздела «Шаг 6.2. Привязка HTTPS»- Sites → Portal → Bindings… → Add….
- Type: https, Port: 443, Host name:
portal.company.ru. - SSL certificate: сертификат из шага 6.1.
- Включите Require Server Name Indication, если на этом IIS уже есть другие HTTPS-сайты.
Откройте TCP 443 в брандмауэре Windows.
Как проверить: в браузере на сервере или с рабочей станции откройте https://portal.company.ru. Замочек показывает сертификат компании.
Без IIS API слушает только http://127.0.0.1:3001/. Для сотрудников нужен сайт IIS или корпоративный шлюз (§7).
7. Сертификат уже на корпоративном шлюзе
Заголовок раздела «7. Сертификат уже на корпоративном шлюзе»Если F5, корпоративный nginx или другой балансировщик уже показывает сотрудникам сертификат компании, файлы в Portal можно не класть.
Шлюз принимает HTTPS и проксирует запросы на Portal:
| Куда на Portal | Порт |
|---|---|
| Docker, Native Linux | 80 |
| Kubernetes | HTTP Ingress (в values ingress.tls.enabled: false) |
| Native Windows | сайт IIS на порту 80 |
Передавайте заголовок Host с именем сайта (portal.company.ru), тем же, что в portal.domain.
Такой вход в браузере работает: замочек выпускает шлюз. Cookie входа при этом ставится без флага Secure, потому что до nginx Portal запрос приходит по HTTP. Чтобы API видел HTTPS, закончите TLS на самом Portal — разделы §3–§6 — либо направьте шлюз на HTTPS-порт Portal (443), где уже стоит этот сертификат.
На шлюзе сохраните большие тела и долгие соединения: загрузки до 4 ГБ, WebDAV (/api/v1/dav/), SSE. В штатном nginx и Ingress это уже задано.
8. Portal Office
Заголовок раздела «8. Portal Office»Редактор на отдельном имени (office.company.ru) получает свой сертификат на это имя.
| Канал | Куда |
|---|---|
| Kubernetes | секрет office-tls, см. §4 |
| Отдельный хост за своим nginx | listen 443 ssl на vhost Office |
| Docker/K8s в одном стеке | тот же приём, что у сайта Portal, на хосте Office |
В конфиге Portal: office.publicUrl: https://office.company.ru. У самой службы Office TLS обычно выключен (ssl.enable=false), сертификат стоит на прокси перед ней. Подробнее: Portal Office.
9. Проверка в браузере
Заголовок раздела «9. Проверка в браузере»- Откройте
https://portal.company.ru. - Замочек показывает сертификат компании, имя сайта совпадает, срок не истёк.
- Вход под
adminсохраняется после обновления страницы.
Если браузер пишет, что имя не совпадает, в сертификате нет того SAN, который набран в адресной строке. Если предупреждение о недоверенном издателе — в cert.pem не попала промежуточная цепочка, либо УЦ не стоит в доверенных на компьютерах сотрудников.