Перейти к содержимому

HTTPS: сертификат компании

Эта инструкция — для администратора, который уже установил Portal и хочет открывать его по имени компании с уже выпущенным SSL-сертификатом.

Portal сертификат не выпускает и в удостоверяющий центр не обращается. Вы подставляете свой файл: корпоративного УЦ или публичного (GlobalSign, Let’s Encrypt и т.п.).

Читайте сверху вниз. Сначала подготовьте файлы, затем откройте раздел своего канала.


ЧтоЗачем
Имя сайта, например 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.


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.pem
openssl 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.


КаналГде заканчивается HTTPS
Dockernginx контейнера frontend, порт 443
KubernetesIngress, секрет TLS
Native Linuxnginx на хосте, файл /etc/nginx/sites-available/portal
Native Windowsпривязка HTTPS сайта IIS Portal
Уже стоит на корпоративном шлюзешлюз отдаёт сертификат сотрудникам — §7

Штатный nginx Portal подставляет заголовок X-Forwarded-Proto из схемы своего входящего соединения. Когда сотрудники открывают https://… прямо на этом nginx, на Ingress или на IIS, API видит HTTPS и ставит cookie входа с флагом Secure.


Контейнер frontend читает /etc/nginx/ssl/cert.pem и key.pem. Каталог на хосте задаётся переменной PORTAL_TLS_CERT_DIR в .env. Если при старте файлов нет, контейнер создаёт самоподписанный сертификат на 10 лет. Положите файлы компании в каталог до пересоздания контейнера.

Окно терминала
sudo mkdir -p /etc/portal/tls
sudo cp cert.pem key.pem /etc/portal/tls/
sudo chown root:root /etc/portal/tls/cert.pem /etc/portal/tls/key.pem
sudo chmod 644 /etc/portal/tls/cert.pem
sudo chmod 600 /etc/portal/tls/key.pem

Процесс nginx в контейнере стартует от root и должен читать ключ.

В каталоге bundle, рядом с docker-compose.yml, откройте .env и задайте абсолютный каталог на хосте:

PORTAL_TLS_CERT_DIR=/etc/portal/tls

Если строки ещё нет — добавьте её. Внутри каталога уже лежат cert.pem и key.pem.

Окно терминала
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.


HTTPS завершается на Ingress. В под frontend сертификат класть не нужно: Service frontend слушает порт 80 внутри кластера.

Окно терминала
kubectl create secret tls portal-tls \
--cert=cert.pem \
--key=key.pem \
-n portal

cert.pem здесь — сертификат сайта и промежуточная цепочка одним файлом.

В 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 portal
office:
ingress:
host: office.company.ru
tls:
enabled: true
secretName: office-tls
Окно терминала
helm upgrade portal ./helm/portal \
-n portal \
-f portal-values.generated.yaml

Путь к chart — из вашего bundle (ls helm/).

Как проверить:

Окно терминала
kubectl get ingress -n portal
echo | 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.


Установщик кладёт vhost в /etc/nginx/sites-available/portal. В поставке он слушает порт 80. Сертификат добавляется в тот же блок server: так сохраняются location для API, WebDAV и загрузок.

Окно терминала
sudo mkdir -p /etc/portal/tls
sudo cp cert.pem key.pem /etc/portal/tls/
sudo chown root:root /etc/portal/tls/cert.pem /etc/portal/tls/key.pem
sudo chmod 644 /etc/portal/tls/cert.pem
sudo chmod 600 /etc/portal/tls/key.pem

Откройте /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).

Окно терминала
sudo nginx -t
sudo systemctl reload nginx

Как проверить: openssl s_client из §3.3 и вход в браузере по https://portal.company.ru.

Замена сертификата: перезапишите PEM и снова sudo systemctl reload nginx.


Сайт IIS Portal после установки слушает порт 80. Сертификат привязывается к этому сайту.

  1. Диспетчер IIS → имя сервера → Server Certificates.
  2. Import… и укажите .pfx компании (нужен пароль контейнера).
  3. Сертификат появляется в списке с закрытым ключом.
  1. Sites → Portal → Bindings… → Add….
  2. Type: https, Port: 443, Host name: portal.company.ru.
  3. SSL certificate: сертификат из шага 6.1.
  4. Включите Require Server Name Indication, если на этом IIS уже есть другие HTTPS-сайты.

Откройте TCP 443 в брандмауэре Windows.

Как проверить: в браузере на сервере или с рабочей станции откройте https://portal.company.ru. Замочек показывает сертификат компании.

Без IIS API слушает только http://127.0.0.1:3001/. Для сотрудников нужен сайт IIS или корпоративный шлюз (§7).


Если F5, корпоративный nginx или другой балансировщик уже показывает сотрудникам сертификат компании, файлы в Portal можно не класть.

Шлюз принимает HTTPS и проксирует запросы на Portal:

Куда на PortalПорт
Docker, Native Linux80
KubernetesHTTP 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 это уже задано.


Редактор на отдельном имени (office.company.ru) получает свой сертификат на это имя.

КаналКуда
Kubernetesсекрет office-tls, см. §4
Отдельный хост за своим nginxlisten 443 ssl на vhost Office
Docker/K8s в одном стекетот же приём, что у сайта Portal, на хосте Office

В конфиге Portal: office.publicUrl: https://office.company.ru. У самой службы Office TLS обычно выключен (ssl.enable=false), сертификат стоит на прокси перед ней. Подробнее: Portal Office.


  1. Откройте https://portal.company.ru.
  2. Замочек показывает сертификат компании, имя сайта совпадает, срок не истёк.
  3. Вход под admin сохраняется после обновления страницы.

Если браузер пишет, что имя не совпадает, в сертификате нет того SAN, который набран в адресной строке. Если предупреждение о недоверенном издателе — в cert.pem не попала промежуточная цепочка, либо УЦ не стоит в доверенных на компьютерах сотрудников.