Настройка PSN
- Первым шагом настройки на стороне PSN («МойОфис Почта 3») является подготовка сертификата и ключа сертификата в PEM-формате. Сертификат должен быть выписан на домен тенанта в wildcard-виде *.$
{domain}или для следующих имен:
mail.$`{domain}`
smtp.$`{domain}`
imap.$`{domain}`
psnapi.$`{domain}`
pbm.$`{domain}`
cab.$`{domain}`
autoconfig.$`{domain}`
Где ${domain} — домен целевого тенанта.
Файлы сертификата и ключа не должны содержать пустых строк. Также сертификат должен содержать полную цепочку промежуточных центров сертификации (CA), если такие имеются.
Более подробно настройка сертификатов для PSN описана в документации по «МойОфис Почта».
- Следующим шагом для формирования 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>.
- Сформированный 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).
- В случае настроенной интеграции PSN и PGS для корректной работы SSO (single sign on) необходимо выполнить дополнительную настройку параметров в ETCD (и для CO, и для PSN).
Первым шагом будет определение единого секрета для oauth2 следующей командой:
- Далее на ноде СО с ролью 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.
- При интеграции 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).
- На ноде 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.
- Финальным шагом будет перезапуск сервис psn-nginx-proxy_nginx c любой мастер ноды PSN:
docker service update --force psn-nginx-proxy_nginx
После успешного выполнения всех приведенных выше операций CO и PSN начнут обрабатывать запросы на новый домен (в том числе с использованием SSO).