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, $passwordif ((($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/bashCERT=/home/scp/mail.domain.com.pfxLOG=/var/log/scriptif [ -f $CERT ]; thenmv /etc/postfix/ssl/domain.key /etc/postfix/ssl/domain.key.oldmv /etc/postfix/ssl/domain.pem /etc/postfix/ssl/domain.pem.oldecho SUCCESS $(date +"%y-%m-%d %T") старые сертификаты переименованы! >> $LOGopenssl 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") сертификаты сконвертированы! >> $LOGsleep 5postfix reloadecho SUCCESS $(date +"%y-%m-%d %T") Postfix перезапущен! >> $LOGsleep 5rm -rf $CERTecho SUCCESS $(date +"%y-%m-%d %T") новый сертификат успешно установлен! >> $LOGelseecho ERROR $(date +"%y-%m-%d %T") новый сертификат не найден >> $LOGfi

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

спасибо за материал evgen.me