Let’s Encrypt для Exchange и Postfix

Решил попробовать прикрутить Let’s Encrypt сертификат к связке Exchange + Postfix. Как оказалось под Windows есть уже аналог Certbot, который умеет самостоятельно выпускать и обновлять сертификаты.
Схема работы примерно такая:

  • На Exchange периодически выпускается и применяется сертификат Let’s Encrypt
  • Powershell скрипт переносит обновленный сертификат на Linux сервер с Postfix
  • На Linux сервере сертификат конвертируется и подсовывается в Postfix

P.S. Хотя можно было бы не усложнять и на Postfix использовать любой другой сертификат.

И так, отсюда скачиваем win-acme, это программа будет заниматься выпуском сертификата и его обновлением, и установкой.
Открываем к серверу Exchange доступ по 80 и 443 портам. И не забываем создать А записи на DNS, которые будут ссылаться на наш Exchange.

После проделанных операций, запускаем win-acme в CMD со следующим ключом:

C:\Program Files\Lets Encrypt>letsencrypt.exe --plugin manual --manualhost mail.domain.com,exch.domain.com,autodiscover.domain.com --validation selfhosting --centralsslstore C:\Central_SSL\ --installation iis,manual --installationsiteid 1 --script "./Scripts/PSScript.bat" --scriptparameters "./Scripts/ImportExchange.ps1 {5} IIS,SMTP,IMAP 1 "exch.domain.com" C:\Central_SSL\"

В итоге мы получим SAN сертификат для 3-х доменных имен (mail.domain.com,exch.domain.com,autodiscover.domain.com), который будет автоматически установлен в Exchange для служб IIS,SMTP,IMAP. Сам сертификат будет размещен в папке C:\Central_SSL\, а в планировщике заданий будет создан скрипт, который ежедневно будет проверять, не нужно ли перевыпустить сертификат. Подтверждение ваших доменов происходит в автоматическом режиме, путем создания временного сайта в IIS.

Далее, полученный сертификат, мне нужно перенести на Linux сервер. Для этого я воспользуюсь модулем для PowerShell — Posh-SSH.
Сам скрипт:

Import-Module Posh-SSH
$CreateDate = (Get-Item C:\Central_SSL\mail.domain.com.pfx).LastWriteTime
$CurrentDate = (Get-Date)
$user = 'scp'
$key = @(1..24)
$password = Get-Content C:\Scripts\pass.txt | ConvertTo-SecureString -Key $key
$credentials = New-Object -TypeName System.Management.Automation.PSCredential  -ArgumentList $user, $password
if ((($CurrentDate - $CreateDate).Days) -eq "0") {
    Set-SCPFile -LocalFile C:\Central_SSL\mail.domain.com.pfx -RemotePath  '/home/scp' -ComputerName 10.1.1.1 -Credential $credentials
}
Этот скрипт нужно поместить в планировщик с ежедневным выполнением. Он проверяет, появился ли новый сертификат (топорно проверяет) и если да, то отправляет его по SSH на Linux сервер с ip — 10.1.1.1
Единственное предварительно нужно сгенерировать credentials, что бы получить пароль от SSH в зашифрованном виде.
Это можно сделать таким скриптом:
$credentials = Get-Credential scp
$key = @(1..24)
$credentials.Password | ConvertFrom-SecureString -Key $key | Set-Content pass.txt

На Linux сервере заведен пользователь scp, в домашний каталог которого, попадает сертификат.

В cron на этом сервере добавлен скрипт, который ежедневно выполняется:

#!/bin/bash
CERT=/home/scp/mail.domain.com.pfx
LOG=/var/log/script
if [ -f $CERT ]; then
    mv /etc/postfix/ssl/domain.key /etc/postfix/ssl/domain.key.old
    mv /etc/postfix/ssl/domain.pem /etc/postfix/ssl/domain.pem.old
    echo SUCCESS $(date +"%y-%m-%d %T") старые сертификаты переименованы! >> $LOG
    openssl pkcs12 -nocerts -in /home/scp/mail.domain.com.pfx -out /etc/postfix/ssl/domain.key -nodes -password pass:
    openssl pkcs12 -in /home/scp/mail.domain.com.pfx -out /etc/postfix/ssl/domain.pem -nokeys -password pass:
    echo SUCCESS $(date +"%y-%m-%d %T") сертификаты сконвертированы! >> $LOG
    sleep 5
    postfix reload
    echo SUCCESS $(date +"%y-%m-%d %T") Postfix перезапущен! >> $LOG
    sleep 5
    rm -rf $CERT
    echo SUCCESS $(date +"%y-%m-%d %T") новый сертификат успешно установлен! >> $LOG
else
    echo ERROR $(date +"%y-%m-%d %T") новый сертификат не найден >> $LOG
fi

Скрипт преобразует сертификат в ключ + сертификат в формате pem. И перезапускает Postfix.

4 комментария

  1. Здравствуйте!

    Подскажите, пожалуйста, а если мне нужно этот сертификат импортировать в несколько exchange серверов?

    1. Ты же по факту получаешь сертификат в pfx контейнере, его можно дальше на любые серверы импортировать, в том числе и на копии Exchange.

    1. Для подтверждения через DNS нужен или собственный публичный DNS сервер или DNS сервер, который поддерживает какой-то API, а лучше именно Let’s Encrypt.

Добавить комментарий

Ваш адрес email не будет опубликован.