Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Оплата
Новости
Доставка
Загрузки
Форум
Настройка
    info@proxmox.su
    +7 (495) 320-70-49
    Заказать звонок
    Аспро: ЛайтШоп
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Аспро: ЛайтШоп
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Аспро: ЛайтШоп
    Телефоны
    +7 (495) 320-70-49
    Заказать звонок
    0
    0
    0
    Аспро: ЛайтШоп
    • +7 (495) 320-70-49
      • Назад
      • Телефоны
      • +7 (495) 320-70-49
      • Заказать звонок
    • info@proxmox.su
    • Москва, Бакунинская улица, 69с1
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Proxmox Mail Gateway
    [УРОК] Как настроить — Lets Encrypt и PMG

    Форумы: Proxmox Виртуальная Среда, Proxmox Backup Server, Proxmox Mail Gateway, Proxmox Datacenter Manager
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    [УРОК] Как настроить — Lets Encrypt и PMG, Proxmox Mail Gateway
     
    ChFin
    Guest
    #1
    0
    17.02.2018 10:38:00
    Let's Encrypt — это бесплатный, автоматизированный и открытый центр сертификации. Этот CA выдает стандартные сертификаты для проверки домена. Сертификаты можно использовать для веб-серверов, почтовых серверов, FTP-серверов и многих других целей. Шифрование электронной почты и подпись кода требуют другого типа сертификатов, которые Let's Encrypt не выдает.

    Ниже несколько ссылок, которые стоит прочитать:  
    Документация тут: https://letsencrypt.org/docs/  
    Важно: что нужно знать о проблемах проверки TLS-SNI https://community.letsencrypt.org/t...to-know-about-tls-sni-validation-issues/50811  
    Про Let's Encrypt и записи DNS CAA читайте здесь: https://letsencrypt.org/docs/caa/  

    Если вас не интересует CAA, ничего делать не надо, но если возникнут ошибки — смотрите раздел про ошибки CAA в документе выше.  
    Если хотите использовать записи CAA, воспользуйтесь генератором CAA: https://sslmate.com/caa/

    Proxmox Mail Gateway использует ключи и сертификаты для установления защищенных соединений. Приложение использует ключи и сертификаты, хранящиеся здесь:  
    /etc/pmg/pmg-api.pem — ключ и сертификат (вместе) для HTTPS-сервера (API)  
    /etc/pmg/pmg-tls.pem — ключ и сертификат (вместе) для шифрования почтового трафика (TLS)

    Учтите, что само приложение может перезаписывать некоторые файлы ключей и сертификатов, например, если вы отключаете и включаете TLS в настройках почтового прокси.

    Для замены TLS-сертификатов мы запрашиваем их у CA Let's Encrypt с помощью приложения certbot.

    Требования:  
    - Открыт входящий HTTP-трафик (порт 80).  
    - Корректно настроено имя хоста.  
    - В конфигурации PMG Mail Proxy включены TLS и логирование TLS.

    Установка  
    Рекомендуется использовать certbot из репозитория stretch-backports. Для этого добавьте репозиторий в /etc/apt/sources.list:  
    # vi /etc/apt/sources.list  
    Добавьте строку:  
    deb http://ftp.debian.org/debian stretch-backports main  

    После сохранения выполните:  
    # apt-get update  

    Чтобы установить certbot, выполните:  
    # apt-get install certbot -t stretch-backports  

    Перед запросом сертификата создайте скрипт post-hook в каталоге /root:  
    # cd /root  
    # vi certbot-post-hook.sh

    Код скрипта:  
    #!/bin/bash  
    # post-hook, смотрите renewalparams в /etc/letsencrypt/renewal/$(hostname -f).conf  

    # замена почтового сертификата  
    cat /etc/letsencrypt/live/$(hostname -f)/fullchain.pem /etc/letsencrypt/live/$(hostname -f)/privkey.pem >/etc/pmg/pmg-tls.pem  
    chown root:root /etc/pmg/pmg-tls.pem  
    chmod 600 /etc/pmg/pmg-tls.pem  

    # замена http сертификата  
    cat /etc/letsencrypt/live/$(hostname -f)/fullchain.pem /etc/letsencrypt/live/$(hostname -f)/privkey.pem >/etc/pmg/pmg-api.pem  
    chown root:www-data /etc/pmg/pmg-api.pem  
    chmod 640 /etc/pmg/pmg-api.pem  

    systemctl restart pmgproxy  

    Дайте скрипту права на выполнение:  
    # chmod 700 certbot-post-hook.sh  

    Теперь можно запросить сертификат:  
    # certbot certonly --authenticator standalone --preferred-challenges http --post-hook "/root/certbot-post-hook.sh" -d $(hostname -f)  

    Введите ваш email, согласитесь с условиями использования и ответьте, хотите ли вы делиться своим email.  

    Поздравляем, вы запросили и установили (через post-hook) сертификат Let's Encrypt.  

    Автоматическое обновление  
    Пакет Debian поставляется с cron-заданием и таймером systemd. cron-задание не будет запускать renew, если обнаружит systemd (/run/systemd/system). Всё происходит через certbot.timer.  

    Чтобы обновление проходило автоматически, убедитесь, что certbot.timer включен и запущен. Параметры Post-Hook и Preferred Challenges сохраняются в /etc/letsencrypt/renewal/$(hostname -f).conf во время запроса сертификата.  

    Проверить статус:  
    # systemctl status certbot.timer  

    Статус должен быть enabled/active (waiting).  

    Проверьте свой сертификат в браузере и наблюдайте за выводом TLS в /var/log/mail.log.  

    Проверить шифрование TLS вашего почтового сервера можно здесь: https://ssl-tools.net/mailservers
     
     
     
    DerDanilo
    Guest
    #2
    0
    23.03.2018 08:56:00
    Создать сервис (включая таймер) — это просто. В любом случае нужно настроить адекватный мониторинг. Следить за какой-то графической записью о периодическом запуске сервиса, который работает время от времени, для меня особого смысла не имеет.
     
     
     
    BJ78945
    Guest
    #3
    0
    27.04.2018 21:52:00
    Спасибо за ваш гайд! Я бы добавил кое-что для кластера и мультидомена. Из коробки это не работает, но, возможно, кому-то поможет. У меня два домена с двумя разными провайдерами DNS. Для MX-записей и самих хостнеймов у меня есть несколько доменов, поэтому нужен мультидоменный сертификат. Если сертификат меняется, функции кластера ломаются из-за смены отпечатка. Значит: 1. Нужно обновлять DNS-записи во время генерации сертификатов. 2. Нужно обновлять отпечатки в конфиге кластера. Я нашёл пару советов в интернете (GitHub, AnalogJ, lexicon (не могу вставить URL, извиняюсь)) и добавил свой код. Можно улучшить! Моё решение (подгоняйте под свои нужды!):

    Код:  
    certbot certonly --manual --preferred-challenges dns --manual-auth-hook "/etc/letsencrypt/certbot.default.sh auth" --manual-cleanup-hook "/etc/letsencrypt/certbot.default.sh cleanup" --post-hook="/etc/letsencrypt/certbot-post-hook.sh" -d host1 -d host2 -d mx1 -d mx2

    /etc/letsencrypt/certbot.default.sh  
    Код:  
    #!/usr/bin/env bash  
    #  

    set -euf -o pipefail

    PROVIDER1="abc"  
    PROVIDER1_CREDENTIALS=("XXX")  
    PROVIDER2="def"  
    PROVIDER2_CREDENTIALS=("XXX")  
    PROVIDER_UPDATE_DELAY=30

    # Для вызова через --manual-auth-hook certbot  
    function auth {  
       if [[ "${CERTBOT_DOMAIN}" == *"domain1"* ]]; then
           lexicon "${PROVIDER1}" "${PROVIDER1_CREDENTIALS[@]}" \
           create "${CERTBOT_DOMAIN}" TXT --name "_acme-challenge.${CERTBOT_DOMAIN}" --content "${CERTBOT_VALIDATION}"  
       else  
           lexicon "${PROVIDER2}" "${PROVIDER2_CREDENTIALS[@]}" \
           create "${CERTBOT_DOMAIN}" TXT --name "_acme-challenge.${CERTBOT_DOMAIN}" --content "${CERTBOT_VALIDATION}"  
       fi

       sleep "${PROVIDER_UPDATE_DELAY}"  
    }

    # Для вызова через --manual-cleanup-hook certbot  
    function cleanup {  
       if [[ "${CERTBOT_DOMAIN}" == *"domain1"* ]]; then
           lexicon "${PROVIDER1}" "${PROVIDER1_CREDENTIALS[@]}" \
           delete "${CERTBOT_DOMAIN}" TXT --name "_acme-challenge.${CERTBOT_DOMAIN}" --content "${CERTBOT_VALIDATION}"  
       else  
           lexicon "${PROVIDER2}" "${PROVIDER2_CREDENTIALS[@]}" \
           delete "${CERTBOT_DOMAIN}" TXT --name "_acme-challenge.${CERTBOT_DOMAIN}" --content "${CERTBOT_VALIDATION}"  
       fi  
    }

    HANDLER=$1; shift;  
    if [ -n "$(type -t $HANDLER)" ] && [ "$(type -t $HANDLER)" = function ]; then
     $HANDLER "$@"  
    fi

    /etc/letsencrypt/certbot-post-hook.sh  
    Код:  
    #!/bin/bash

    # заменить почтовый сертификат  
    cat /etc/letsencrypt/live/host1/fullchain.pem /etc/letsencrypt/live/host1/privkey.pem >/etc/pmg/pmg-tls.pem  
    chown root:root /etc/pmg/pmg-tls.pem  
    chmod 600 /etc/pmg/pmg-tls.pem  
    scp /etc/pmg/pmg-tls.pem host2:/etc/pmg/pmg-tls.pem

    # заменить HTTP-сертификат  
    cat /etc/letsencrypt/live/host1/fullchain.pem /etc/letsencrypt/live/host1/privkey.pem >/etc/pmg/pmg-api.pem  
    chown root:www-data /etc/pmg/pmg-api.pem  
    chmod 640 /etc/pmg/pmg-api.pem  
    scp /etc/pmg/pmg-api.pem host2:/etc/pmg/pmg-api.pem

    # сгенерировать хеш сертификата и поделиться с нодами кластера  
    HASH="$(openssl x509 -in /etc/pmg/pmg-api.pem -noout -fingerprint -sha256 | cut -d'=' -f2)"  
    cp /etc/pmg/cluster.conf /etc/pmg/cluster.conf.bkp  
    sed "s/.*fingerprint.*/        fingerprint $HASH/" /etc/pmg/cluster.conf.bkp > /etc/pmg/cluster.conf  
    scp /etc/pmg/cluster.conf host2:/etc/pmg/cluster.conf

    # перезапустить сервисы  
    systemctl restart pmgproxy  
    ssh root@host2 'systemctl restart pmgproxy'

    Позже добавлю обновление TLSA-записей для DANE. Генерация записей возможна командой:

    Код:  
    tlsa --create --selector 1 --port 25 --certificate /etc/letsencrypt/live/host1/cert.pem host1  
    ... host2  
    ... mx1  
    ... mx2

    Остаётся только немного поработать с строками и командами lexicon.
     
     
     
    Jarkko
    Guest
    #4
    0
    08.03.2019 17:41:00
    Спасибо за это! Вот что я использую, чтобы подставить новый хеш из сертификата для каждого сервера:

    Код:  
    #!/bin/bash  
    HASH="$(openssl x509 -in /etc/pmg/pmg-api.pem -noout -fingerprint -sha256 | cut -d'=' -f2)"  
    sed -i "0,/fingerprint/{s/.*fingerprint.*/        fingerprint ${HASH}/}" /etc/pmg/cluster.conf  

    Это работает и на нодах, просто подкорректируйте "0", чтобы найти нужный fingerprint для вашей ноды.
     
     
     
    Robert H.
    Guest
    #5
    0
    10.04.2019 13:08:00
    Вот у меня есть рабочее решение для двух шлюзов, которые постоянно обновляют друг друга при выпуске нового сертификата: bash-скрипт:  
    Код:  
    #!/bin/bash  
    # post-hook, см. renewalparams в /etc/letsencrypt/renewal/$(hostname -f).conf  
    # https://forum.proxmox.com/threads/how-to-lets-encrypt-and-pmg.41493/  

    # заменяем почтовый сертификат  
    cat /etc/letsencrypt/live/$(hostname -f)/fullchain.pem /etc/letsencrypt/live/$(hostname -f)/privkey.pem >/etc/pmg/pmg-tls.pem  
    chown root:root /etc/pmg/pmg-tls.pem  
    chmod 600 /etc/pmg/pmg-tls.pem  

    # заменяем HTTP-сертификат  
    cat /etc/letsencrypt/live/$(hostname -f)/fullchain.pem /etc/letsencrypt/live/$(hostname -f)/privkey.pem >/etc/pmg/pmg-api.pem  
    chown root:www-data /etc/pmg/pmg-api.pem  
    chmod 640 /etc/pmg/pmg-api.pem  

    cp /etc/pmg/cluster.conf /etc/pmg/cluster.conf.bkp  
    HASH="$(openssl x509 -in /etc/pmg/pmg-api.pem -noout -fingerprint -sha256 | cut -d'=' -f2)"  

    if [[ $HOSTNAME == mta01 ]]; then
     awk -v HASH="        fingerprint $HASH" '{ if (NR == 2) {print HASH} else {print $0}}' /etc/pmg/cluster.conf.bkp > /etc/pmg/cluster.conf  
     scp /etc/pmg/cluster.conf user@mta02:/etc/pmg/cluster.conf  
     ssh user@mta02 'systemctl restart pmgproxy'  
    else  
     awk -v HASH="        fingerprint $HASH" '{ if (NR == 10) {print HASH} else {print $0}}' /etc/pmg/cluster.conf.bkp > /etc/pmg/cluster.conf  
     scp /etc/pmg/cluster.conf user@mta01:/etc/pmg/cluster.conf  
     ssh user@mta01 'systemctl restart pmgproxy'  
    fi  

    systemctl restart pmgproxy  

    А дальше нужно запустить certbot:  
    Код:  
    certbot certonly --authenticator standalone --preferred-challenges http --post-hook "/path/to/certbot-post-hook.sh" -d $(hostname -f)
     
     
     
    picateclas
    Guest
    #6
    0
    09.02.2020 12:54:00
    Протестировано и работает с последней версией 6.1. Спасибо!
     
     
     
    jmjosebest
    Guest
    #7
    0
    25.05.2020 15:13:00
    Почему это не интегрировано в графический интерфейс, как в PVE?
     
     
     
    Stoiko Ivanov
    Guest
    #8
    0
    25.05.2020 15:24:00
    Так как это ещё не реализовано — на самом деле мы планируем в будущем интегрировать решение, используемое в PVE, с PMG — но никаких гарантий, когда это произойдёт.
     
     
     
    jmjosebest
    Guest
    #9
    0
    25.05.2020 18:06:00
    Это хорошо, спасибо.
     
     
     
    renne
    Guest
    #10
    0
    30.08.2020 03:37:00
    Первым шагом могла бы стать опция настройки, позволяющая контейнеру PMG получить доступ к хранилищу сертификатов PVE.
     
     
     
    jdnva
    Guest
    #11
    0
    05.02.2021 05:02:00
    Сработало отлично для меня, большое спасибо, работает! Огромное спасибо!
     
     
     
    altice5566
    Guest
    #12
    0
    06.02.2021 12:23:00
    Всё работает отлично, спасибо!
     
     
     
    shabsta
    Guest
    #13
    0
    24.02.2021 03:56:00
    Всё ещё ничего?
     
     
     
    jaydouble
    Guest
    #14
    0
    24.02.2021 08:44:00
    У меня есть обновлённый скрипт, который автоматически обновляет все узлы в кластере. Код:

    #!/bin/bash  
    # post-hook смотри renewalparams в /etc/letsencrypt/renewal/$(hostname -f).conf

    # заменяем почтовый сертификат  
    cat /etc/letsencrypt/live/$(hostname -f)/fullchain.pem /etc/letsencrypt/live/$(hostname -f)/privkey.pem >/etc/pmg/pmg-tls.pem  
    chown root:root /etc/pmg/pmg-tls.pem  
    chmod 600 /etc/pmg/pmg-tls.pem

    # заменяем http-сертификат  
    cat /etc/letsencrypt/live/$(hostname -f)/fullchain.pem /etc/letsencrypt/live/$(hostname -f)/privkey.pem >/etc/pmg/pmg-api.pem  
    chown root:www-data /etc/pmg/pmg-api.pem  
    chmod 640 /etc/pmg/pmg-api.pem

    # получаем старый HASH из конфигурации кластера  
    OLDHASH="$(grep "name $(hostname)$" /etc/pmg/cluster.conf -B4 | grep fingerprint | awk '{print $2}')"

    # получаем новый хеш сертификата из нового файла  
    NEWHASH="$(openssl x509 -in /etc/pmg/pmg-api.pem -noout -fingerprint -sha256 | cut -d'=' -f2)"

    # обновляем конфигурацию кластера только если хеш изменился  
    if [ "$OLDHASH" != "$NEWHASH" ]
    then  
     echo -e "Хеш: \n${OLDHASH}\nбудет заменён на\n${NEWHASH}\n"  
     sed -i.bak -e "s/$OLDHASH/$NEWHASH/g" /etc/pmg/cluster.conf  
    fi

    # получаем собственный IP-адрес  
    OWNIP="$(hostname -i)"

    # получаем все IP-адреса из кластера, кроме своего  
    OTHERS=$(grep $'\tip' /etc/pmg/cluster.conf | grep -v ${OWNIP} | awk '{print $2}')

    # перебираем $OTHERS, копируем cluster.conf и перезапускаем pmgproxy на том хосте, если копирование прошло успешно  
    for host in $OTHERS  
    do  
     echo "Копируем обновлённый cluster.conf на ${host}."  
     if scp /etc/pmg/cluster.conf user@${host}:/etc/pmg/cluster.conf 2>&1 >/dev/null  
     then  
       echo "Перезапускаем PMGproxy на ${host}"  
       ssh user@${host} systemctl restart pmgproxy  
     else  
       echo "Что-то пошло не так при копировании";  
     fi  
    done

    systemctl restart pmgproxy
     
     
     
    rtlarose
    Guest
    #15
    0
    25.02.2021 18:33:00
    Здравствуйте, это подходит только для чистой установки Proxmox? Спрашиваю, потому что я занялся усилением безопасности сервера и установил fail2ban. Когда попытался поставить letsencrypt, он не дал этого сделать. Думаю, это связано с чем-то, что делается после установки. Буду признателен за любые советы. Роберт
     
     
     
    Страницы: 1
    Читают тему
    +7 (495) 320-70-49
    info@proxmox.su

    Конфиденциальность Оферта
    © 2026 Proxmox.su
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры