Skip to main content

Настройка PSN

  1. Первым шагом настройки на стороне PSN («МойОфис Почта 3») является подготовка сертификата и ключа сертификата в PEM-формате. Сертификат должен быть выписан на домен тенанта в wildcard-виде *.${domain} или для следующих имен:
mail.$`{domain}`
smtp.$`{domain}`
imap.$`{domain}`
psnapi.$`{domain}`
pbm.$`{domain}`
cab.$`{domain}`
autoconfig.$`{domain}`

Где ${domain} — домен целевого тенанта.

Файлы сертификата и ключа не должны содержать пустых строк. Также сертификат должен содержать полную цепочку промежуточных центров сертификации (CA), если такие имеются.

Более подробно настройка сертификатов для PSN описана в документации по «МойОфис Почта».

  1. Следующим шагом для формирования PUT-запроса в API PSN необходимо получить токен авторизации в PBM (backend manager), пример:
creator='`<creator_email>`'
pass='<password>'
pbm_domain='<pbm_domain>'
psn_token=$(curl -s "https://$`{pbm_domain}`/v2/auth" \
-d login=$`{creator}` \
-d password=$`{pass}` | jq -r .result.access_token)

Где:

  • <creator_email> — логин в PBM общего вида creator@<install_domain> ;
  • <password> — значение переменной ds389_manager_user из инвентарного файла установки PSN;
  • <pbm_domain> — URL сервера PSN с ролью PBM общего вида pbm[-env].<install_domain>.
  1. Сформированный PUT-запрос выполняется следующей командой:
webmail="mail.$`{domain}`"
curl -H "Authorization: Bearer $`{psn_token}`" -XPUT \
https://$`{pbm_domain}`/v2/domains/$`{tenant_id}`/$`{domain}` \
-F "webmail_domain=$`{webmail}`" \
-F "crt=@$`{cert_file}`" \
-F "key=@$`{cert_key_file}`"
#если не получилось передать сертификаты через флаг -F, можно передать json через -d
psn_cert=$(cat $cert_file | sed 's/$/\\n/' | tr -d '\n' | sed 's/\\n$//')
psn_key=$(cat $cert_key_file | sed 's/$/\\n/' | tr -d '\n' | sed 's/\\n$//')
curl -X PUT -H 'Accept: application/json' \
-H 'Accept-Encoding: gzip, deflate' -H "Authorization: Bearer $`{psn_token}`" \
-H 'Content-Type: application/json' \
-d "`{\"webmail_domain\": \"${webmail}`\", \"key\": \"$`{psn_key}`\", \"crt\": \"$`{psn_cert}`\"}" https://$`{pbm_domain}`/v2/domains/$`{tenant_id}`/$`{domain}`

Где:

  • <pbm_domain> — URL сервера PSN с ролью PBM;
  • ${tenant_id} — ID тенанта (получается методом, аналогичном описанному п.1);
  • ${domain} — целевой домен;
  • ${webmail} — имя mail.${domain} (имя домена PSN с ролью mail).
  1. В случае настроенной интеграции PSN и PGS для корректной работы SSO (single sign on) необходимо выполнить дополнительную настройку параметров в ETCD (и для CO, и для PSN).

Первым шагом будет определение единого секрета для oauth2 следующей командой:

  1. Далее на ноде СО с ролью etcd следует выполнить:
# Узнать текущую версию $`{etcd_version}`
docker exec -it $(docker ps -qf name=etcd3) etcdctl ls /nct/co
/nct/co/28.0.9
docker exec -it $(docker ps -qf name=etcd3) etcdctl set \
/nct/co/$`{etcd_version}`/config/wfe/oauth2_clients/$`{domain//\.}` \
"`{\"client_secret\":\"${secret}`\",\"redirect_uri\":\"https://$`{webmail}`/system/sso\"}"

В clients_id не допускаются сиволы "." и "_". См. переменную ${domain//\.} — убираем точки.

Где:

  • ${etcd_version} — текущая версия ветки ETCD (см. п.2);
  • ${webmail}— имя mail.${domain} (имя домена PSN с ролью mail);
  • ${secret} — секрет для oauth2.
  1. При интеграции PSN для работы frame позволяющего добавлять ссылки на файлы из Облака необходимо добавить. Например:
# В примере добавлено два домена
docker exec -it $(docker ps -qf name=etcd3) etcdctl set \
/nct/co/$`{etcd_version}`/config/wfe/csp.allowed_frame_ancestors.json "[\"https://mail.doc.myoffice-app.ru\",\"https://$`{webmail}`\"]"

Где:

  • ${etcd_version} — текущая версия ветки ETCD;
  • ${webmail} — имя mail.${domain} (имя домена PSN с ролью mail).
  1. На ноде PSN с ролью etcd следует задать параметр командой:
docker exec —i $(docker ps -qf name=etcd.1) etcdctl put \
services/co/psn_mail.$`{domain}` "`{\"client_secret\":\"${secret}`\",\"redirect_uri\":\"https:\/\/mail.$`{domain}`\/system\/sso\",\"client_id\":\"$`{domain//\.}`\",\"sso_url\":\"https:\/\/auth.$`{domain}`\"}"

Где:

  • ${domain} — целевой домен;
  • ${secret} — секрет для oauth2.
  1. Финальным шагом будет перезапуск сервис psn-nginx-proxy_nginx c любой мастер ноды PSN:
docker service update --force psn-nginx-proxy_nginx

После успешного выполнения всех приведенных выше операций CO и PSN начнут обрабатывать запросы на новый домен (в том числе с использованием SSO).