Решил попробовать прикрутить 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