Решил попробовать прикрутить 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 }
$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.
Здравствуйте!
Подскажите, пожалуйста, а если мне нужно этот сертификат импортировать в несколько exchange серверов?
Ты же по факту получаешь сертификат в pfx контейнере, его можно дальше на любые серверы импортировать, в том числе и на копии Exchange.
А как подтвердить домен через dns ? есть такой вариант?
Для подтверждения через DNS нужен или собственный публичный DNS сервер или DNS сервер, который поддерживает какой-то API, а лучше именно Let’s Encrypt.