===== Работа с сертификатами Exchange =====
**Установка сертификатов для IMAP**
:!: //В случае, если мы используем wildcard-сертификат, дополнительно назначать его отдельно - не требуется.//
Необходимо только указать хостнейм для подключения, сервер сам найдёт wildcard-сертификат.
Set-IMAPSettings -X509CertificateName mail.domain.com
Действующий сертификат IMAP будет не виден в списке назначенных сертификатов для сервиса IMAP, если вывести его следующей командой:
Get-ExchangeCertificate | select Thumbprint, Services, NotAfter, Subject, CertificateDomains | where {$_.Services -match "IMAP"} | fl
Если нам всё-таки необходимо назначить сертификат IMAP напрямую, сделать это можно следующим образом:
Enable-ExchangeCertificate -Thumbprint 9043B6B42D0BB935E4CB84F81111506012322A51 -Services 'imap'
----
=== Назначение сертификата службам SMTP ===
Enable-ExchangeCertificate -Thumbprint 9043B6B42D0BB935E4CB84F81111506012322A51 -Services 'smtp'
----
**Edge Transports**
:!: //На серверах Edge Transport не стоит добавлять такие же сертификаты (скажем, один и тот же wildcard-сертификат), как и на mailbox ДЛЯ ВНУТРЕННЕГО ТРАНСПОРТА. В этом случае подписка может работать некорректно.//
Данной командой можно узнать текущий сертификат smtp на Edge Transport:
Get-TransportService | fl *InternalT*
----
**Импорт сертификата на сервер и замена**
:!: //Начиная с Exchange Server 2019 CU12, сертификат можно импортировать только через PowerShell. Импортировать через веб-админку нельзя.//
Пример командлета, импортирующего сертификат:
Import-ExchangeCertificate -Server "mx1" -FileData ([System.IO.File]::ReadAllBytes('C:\cert\cert.p12')) -PrivateKeyExportable:$true -Password (ConvertTo-SecureString -String 'password' -AsPlainText -Force)
После импорта сертификата - его можно назначать сервисам Exchange - к примеру, IIS.
Проверить назначенный сертификат легко в настройках IIS. Пример можно увидеть на скриншоте ниже.
;#;
{{::exchange_cert_bindings.jpg?600|}}
;#;
:!: //Сертификат сайта Exchange Backend менять на внешний WildCard - не обязательно.//
:!: //На серверы Edge Transports можно установить сертификат через оснастку mmc.//
----
**Изменение сертификата на send-connector**
Если мы попробуем удалить старый сертификат после назначения нового через веб - мы получим сообщение, что сертификат нельзя удалять, т.к. он уже назначен коннектору отправки.
;#;
{{::certificate-removal-error.png?600|}}
;#;
Это намекает нам на то, что сертификат необходимо поменять на коннекторе отправки тоже. Здесь есть нюанс, связанный с тем, что при простом выполнении команды //Get-SendConnector | fl//, мы не сможем получить thumbprint сертификата, а получим только имя. Если имена сертификатов совпадают, что часто бывает, когда продляем сертификат от одного и того же УЦ - потребуется сгенерировать имя нового сертификата специальным образом, как описано далее в этом разделе и установить его на коннектор.
:!: //В случае, если коннектор отправки реализован через сервера Edge - описанные действия выполняем на серверах Edge Transport, куда устаналиваем через mmc новый сертификат.//
Чтобы определить - какие именно транспортные серверы участвуют в коннекторе отправки, выполняем команду:
Get-SendConnector -Identity "EdgeSync - Default-First-Site-Name to Internet" | Format-List SourceTransportServers
Для реализации данной задачи нам потребуется узнать thumbprints старого и нового сертификатов. Выполняем команду на сервере, где они установлены.
Get-ExchangeCertificate | Format-List FriendlyName,Subject,Issuer,CertificateDomains,Thumbprint,NotBefore,NotAfter
Для минимизации проблем с потоком почты - лучше остановить сервис транспорта (на всех серверах коннектора отправки):
Stop-Service MSExchangeTransport
Теперь очистим свойство сертификата коннектора отправки следующей командой:
Set-SendConnector -Identity "EdgeSync - Default-First-Site-Name to Internet" -TlsCertificateName $Null
Удаляем старый сертификат со ВСЕХ транспортных серверов (можно удалить через mmc):
Remove-ExchangeCertificate -Server MX_EDGE -Thumbprint
Теперь сгенерируем имя для нового сертификата, используя полученный выше thumbprint:
$cert = Get-ExchangeCertificate -Thumbprint
$tlscertificatename = "$($cert.Issuer)$($cert.Subject)"
После чего, наконец, установим его на коннектор отправки, используя полученное имя:
Set-SendConnector -Identity "EdgeSync - Default-First-Site-Name to Internet" -TlsCertificateName $tlscertificatename
Запускаем транспортную службу на всех серверах, где останавливали:
Start-Service MSExchangeTransport
:!: //Если после этого мы хотим удалить старый сертификат, но всё равно получаем в веб-интерфейсе прежнюю ошибку - удаляем сертификат со всех серверов, на которых он установлен при помощи mmc.//
**Назначение нового сертификата для SMTP edge-транспорта**
Назначения сертификата send-коннектору недостаточно. После этого обязательно назначить сертификат службам SMTP на Edge Transport серверах. Если этого не сделать, рискуем получить задержки при доставке писем, а также неработающее шифрование почты. В логах edge, расположенных в папке:
C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Logs\Edge\ProtocolLog\SmtpSend
Обнаружим ошибку:
TLS negotiation failed with error UnknownCredentials
Если мы запустим на эджах команду //Get-ExchangeCertificate//, мы увидим, что новый сертификат (thumbprint которого будет и в логе) - не назначен сервису SMTP. Отметим thumbprint сертификата и назначим его ОДНИМ ИЗ сертификатов SMTP:
Enable-ExchangeCertificate CERT_THUMBPRINT -Services SMTP
:!: //Если мы используем один с серверами mailbox - wildcard сертификат - мы не хотим назначать его сертификатом по умолчанию, т.к. такие сертификаты на edge использовать нельзя и к тому же, сломает edge subscription. Поэтому, при выполнении командлета Enable-ExchangeCertificate - на запрос о замене сертификата следует ответить "n". В этом случае сервису SMTP будет назначено несколько сертификатов, это позволит работать TLS на Send-коннекторе и оновременно не сломает работу edge subscription.//
{{::not_replace_smtp_exch_edge.jpg|}}
Два сертификата на SMTP:
{{::exchange_smtp_two_certs.jpg|}}
----
=== Скрипт для определения используемого сертификата на SMTP-коннекторах на нескольких серверах ===
#Get all Exchange Servers in the environment
$ExchangeServers = (Get-ExchangeServer |Where-Object {$_.ServerRole -like "mailbox"} )| Select-Object Name,DistinguishedName
$Results = @()
#Process Information
ForEach($Server in $ExchangeServers){
$TransportCert = (Get-ADObject -Identity $Server.DistinguishedName -Properties *).msExchServerInternalTLSCert
$Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$CertBlob = [System.Convert]::ToBase64String($TransportCert)
$Cert.Import([Convert]::FromBase64String($CertBlob))
$server | Add-Member -MemberType NoteProperty -Name DefaultTLSCertSubject -Value $Cert.Subject
$server | Add-Member -MemberType NoteProperty -Name DefaultTLSCertFriendlyName -Value $Cert.FriendlyName
$server | Add-Member -MemberType NoteProperty -Name DefaultTLSCertThumbprint -Value $Cert.Thumbprint
$server | Add-Member -MemberType NoteProperty -Name DefaultTLSCertExpireDate -Value $Cert.NotAfter
$Results += $Server
}
#Show result
$Results | Out-GridView
Автор: https://dirteam.com/bas/2020/06/24/field-notes-what-is-the-current-default-smtp-certificate-for-your-exchange-server-environment/
{{tag>Exchange Microsoft Mail PowerShell Certificates}}