четверг, 22 октября 2020 г.

Использование SSL-сертификатов Let's Encrypt из репозитория GitLab на Zimbra Collaboration OSE

В предыдущей заметке был описан механизм загрузки SSL-сертификатов Let's Encrypt в репозиторий GitLab. Теперь доставим эти сертификаты на сервер Zimbra Collaboration Open Source Edition. Сертификаты и закрытый ключ хранятся в репозитории, так что триггером для запуска процесса обновления сертификатов на почтовом сервере будет служить наличие нового коммита в нём. Скрипт будет запускаться на почтовом сервере и рассчитан на использование в случае, когда один сервер Zimbra обслуживает один почтовый домен.

Создадим скрипт и сделаем его исполняемым
touch /scripts/ssl_update.sh
chmod +x /scripts/ssl_update.sh
Сам скрипт выглядит так:
#!/bin/bash
zimbra_path="/opt/zimbra/ssl/letsencrypt"
branch_name="oldfag.ru"
# Проверяем наличие каталога, если его нет, то создаём
if [ ! -d ${zimbra_path} ]; then
    mkdir -m 0700 ${zimbra_path}
    chown -R zimbra: ${zimbra_path}
fi

# Функция обновления сертификата
certificate_update () {
    su - zimbra -c "zmcertmgr verifycrt comm ${zimbra_path}/privkey.pem ${zimbra_path}/cert.pem ${zimbra_path}/chain.pem"
    if [ $? == 1 ]; then
        echo "certificate not verified"
        exit 1
    fi

    # Сохраняем резервную копию сертификатов
    cp -a /opt/zimbra/ssl/zimbra /opt/zimbra/ssl/zimbra.$(date "+%Y%m%d")

    # Устанавлвием  новый сертификат
    cp ${zimbra_path}/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
    su - zimbra -c "zmcertmgr deploycrt comm ${zimbra_path}/cert.pem ${zimbra_path}/chain.pem"
    if [ $? == 1 ]; then
        echo "certificate deploy failed"
        exit 1
    fi
    su - zimbra -c "zmcontrol restart"
}

# Проверяем существование локального репозитория, если его нет, то создаём
if [ ! -d "${zimbra_path}/.git" ]; then
    git clone --single-branch --branch ${branch_name} https://gituser:gituserpassword@gitlab.oldfag.ru/automation/ssl.git ${zimbra_path}/.
    certificate_update
fi

# Проверяем, есть ли обновления в репозитории
cd ${zimbra_path}
git fetch
if [ $(git rev-parse HEAD) != $(git rev-parse @{u}) ]; then
    git pull
    certificate_update
fi
Для работы скрипта на любом другом сервере нужно изменить только 2 переменных zimbra_path - каталог, в который будут загружаться сертификаты, и branch_name - имя ветки репозитория, в которой хранятся необходимые сертификаты.

При использовании https есть верятность того, что на сервере Zimbra будет отсутствовать корневой сертефикат удостоверяющего центра, выдвшего сертификат, используемый на сервере GitLab, в результате чего при при выполнении git [ clone | fetch | pull ] будет выдаваться сообщение об ошибке. Как это решить описано в соответствующей заметке.

Последнее, что осталось, это добавить запись в /etc/crontab для запуска скрипта по расписанию каждый день в 4 часа утра
# Update zimbra certificate
00 4    * * *   root    /scripts/ssl_update.sh

Комментариев нет:

Отправить комментарий