Exchange Server SSL Sertifikası Kurulumu ve Yenileme

Yıllar önce bir Exchange Server’ın SSL sertifikası tam da kritik bir dönemde sona ermiş ve sabah 07:00’da ofise gelen kullanıcılar Outlook’a bağlanamaz hale gelmişti. O günden sonra sertifika yönetimini hiç hafife almadım. Exchange ortamlarında SSL sertifikası kurulumu ve yenileme süreci, ilk bakışta basit görünse de ince detayları olan, yanlış adımda saatlerce hata ayıklamanıza neden olabilecek bir süreçtir. Bu yazıda hem yeni kurulum hem de yenileme senaryolarını, gerçek dünyada karşılaştığım sorunlarla birlikte ele alacağım.

Exchange Server’da SSL Sertifikasının Önemi

Exchange Server, dışarıya açık birden fazla servis sunar: Outlook Web App (OWA), ActiveSync, Autodiscover, SMTP, POP3, IMAP… Bunların her biri için güvenli bağlantı şarttır. Microsoft’un kendi kendine imzalanmış (self-signed) sertifikasıyla başlayan kurulum, production ortamında kesinlikle kullanılmamalıdır. Tarayıcı uyarıları, mobil cihaz bağlantı sorunları ve Outlook profil problemleri bu sertifikanın izinden gelir.

Bir CA (Certificate Authority) tarafından imzalanmış, geçerli bir SSL sertifikası kurmanız için şu ön koşullar sağlanmış olmalı:

  • Exchange Server kurulumu tamamlanmış ve servisler ayakta olmalı
  • DNS kayıtları doğru yapılandırılmış olmalı (mail.domain.com, autodiscover.domain.com gibi)
  • Sertifika satın alınmış veya Let’s Encrypt gibi ücretsiz bir CA kullanılacaksa gerekli altyapı hazır olmalı
  • Exchange Admin Center (EAC) veya Exchange Management Shell (EMS) erişiminiz olmalı

CSR (Certificate Signing Request) Oluşturma

Süreç her zaman CSR oluşturmakla başlar. Exchange Management Shell üzerinden bu işlemi yapmanızı öneririm, çünkü EAC bazen SAN (Subject Alternative Name) alanlarını doğru kaydetmez.

Exchange sunucunuza RDP ile bağlanın ve Exchange Management Shell’i yönetici olarak açın:

New-ExchangeCertificate `
  -GenerateRequest `
  -SubjectName "C=TR, S=Istanbul, L=Istanbul, O=Sirket Adi, OU=IT, CN=mail.domain.com" `
  -DomainName mail.domain.com, autodiscover.domain.com, webmail.domain.com, domain.com `
  -PrivateKeyExportable $true `
  -RequestFile "C:Certsexchange_csr.req"

Burada dikkat edilmesi gereken birkaç nokta var:

  • -PrivateKeyExportable $true: Sertifikayı başka bir sunucuya taşımanız ya da yedeklemeniz gerekirse bu parametre hayat kurtarır. Varsayılan olarak false gelir, değiştirmeyi unutmayın.
  • -DomainName: Tüm SAN isimlerini buraya yazın. Autodiscover’ı mutlaka ekleyin, yoksa Outlook profil yapılandırması sorun çıkarır.
  • -RequestFile: CSR dosyasının kaydedileceği yer. Bu dosyanın içeriğini CA’ya göndereceksiniz.

CSR dosyası oluşturulduktan sonra içeriğini kontrol edin:

Get-Content "C:Certsexchange_csr.req"

“—–BEGIN CERTIFICATE REQUEST—–” ile başlayan bir çıktı görmelisiniz. Bu içeriği kopyalayıp CA’nın web arayüzüne yapıştıracaksınız.

Sertifika Alma ve Dosya Formatı

CA’dan sertifikanızı aldıktan sonra genellikle size birkaç farklı format sunulur. Exchange için .cer veya .p7b formatını tercih edin. Bazı CA’lar ZIP içinde birden fazla dosya gönderir: sunucu sertifikası, intermediate sertifika ve root sertifika. Hepsini bir yere koyun.

Eğer p7b formatında aldıysanız bunu önce CER formatına çevirmeniz gerekir. Windows’ta bu işlem şöyle yapılır:

certutil -decode "C:Certscertificate.p7b" "C:Certscertificate.cer"

Bazı durumlarda CA size PEM formatında (base64 encoded, .crt uzantılı) sertifika verebilir. Exchange bunu doğrudan kabul eder ama ara sertifikaları ayrı ayrı yüklemeniz gerekebilir. Bu konuya birazdan değineceğim.

Sertifikayı Exchange’e Yükleme

CSR ile oluşturulan pending request üzerine sertifikayı tamamlamak için şu komutu kullanın:

Import-ExchangeCertificate `
  -FileData ([System.IO.File]::ReadAllBytes("C:Certscertificate.cer")) `
  -Password (ConvertTo-SecureString -String "SertifikaParolasi" -AsPlainText -Force)

Eğer sertifika parola korumalı değilse -Password parametresini kullanmayın. Yükleme sonrası sertifikanın durumunu kontrol edin:

Get-ExchangeCertificate | Format-List FriendlyName, Subject, NotAfter, Thumbprint, Status, Services

Burada Status alanının “Valid” göstermesi gerekir. “Pending” görüyorsanız CSR ile sertifika eşleşmesinde sorun var demektir; büyük ihtimalle sertifikayı farklı bir sunucuda üretilmiş CSR ile aldınız veya sertifika dosyası bozuk.

Servislere Sertifikayı Atama

Sertifika yüklenmiş olması yeterli değil. Exchange’e hangi servislerin bu sertifikayı kullanacağını söylemeniz gerekiyor. Thumbprint değerini bir değişkene alarak ilerleyin:

$thumbprint = (Get-ExchangeCertificate | Where-Object {$_.Subject -like "*mail.domain.com*"} | Select-Object -First 1).Thumbprint

Enable-ExchangeCertificate `
  -Thumbprint $thumbprint `
  -Services SMTP, IMAP, POP, IIS `
  -Force

-Services parametresi için kullanılabilecek değerler:

  • SMTP: Mail akışı için zorunlu
  • IIS: OWA, ECP, EWS, ActiveSync, Autodiscover için zorunlu
  • IMAP: IMAP4 servisi kullanıyorsanız
  • POP: POP3 servisi kullanıyorsanız
  • UM: Unified Messaging kullanıyorsanız (Exchange 2016 ve öncesi)

SMTP için sertifikayı atadığınızda sistem size “Eski self-signed sertifikayı SMTP’den kaldırmak istiyor musunuz?” diye sorar. Exchange sunucuları arası iletişim (internal mail flow) için self-signed çalışır ama dış dünyayla iletişim için mutlaka yeni sertifikayı atayın.

Ara Sertifikaları (Intermediate Certificates) Yükleme

Bu adım en çok atlanan ve en çok soruna yol açan kısımdır. Özellikle mobil cihazlar ve bazı mail istemcileri ara sertifikaları olmayan bir sertifika zincirine güvenmez.

Ara sertifikaları Windows Certificate Store’a yüklemeniz gerekir:

# MMC üzerinden ya da certutil ile yapabilirsiniz
certutil -addstore "CA" "C:Certsintermediate.cer"

# Root sertifika için
certutil -addstore "Root" "C:Certsroot.cer"

Yükleme sonrası sertifika zincirini doğrulamak için:

certutil -verify -urlfetch "C:Certscertificate.cer"

Çıktıda “Leaf certificate revocation check passed” ve “Verified Issuance Policies” gibi ifadeler görmelisiniz. Herhangi bir “FAILED” ifadesi varsa zincirde sorun var demektir.

Sertifika Yenileme Süreci

Yenileme, yeni kurulumdan biraz farklı işler. Mevcut sertifikanın son kullanma tarihini izlemek için basit bir PowerShell betiği kullanıyorum:

Get-ExchangeCertificate | Where-Object {$_.NotAfter -lt (Get-Date).AddDays(60)} | 
  Select-Object FriendlyName, Subject, NotAfter, Thumbprint | 
  Format-List

Bu komut sona ermesine 60 günden az kalan sertifikaları listeler. Bunu bir Scheduled Task’a bağlayıp mail ile uyarı gönderebilirsiniz; ama bu konuya başka bir yazıda değineceğim.

Yenileme için iki yol var: aynı CSR’ı kullanmak veya yeni bir CSR oluşturmak. Her zaman yeni bir CSR oluşturmanızı öneririm. Özellikle RSA 2048’den 4096’ya geçiş yapıyorsanız ya da SAN listesini değiştiriyorsanız yeni CSR şart.

Mevcut sertifikanın bilgilerini kullanarak yenileme CSR’ı oluşturmak için:

$oldCert = Get-ExchangeCertificate -Thumbprint "ESKI_THUMBPRINT_DEGERI"

New-ExchangeCertificate `
  -GenerateRequest `
  -SubjectName $oldCert.SubjectName `
  -DomainName ($oldCert.DomainName) `
  -PrivateKeyExportable $true `
  -KeySize 4096 `
  -RequestFile "C:Certsexchange_renewal_csr.req"

Yeni sertifikayı CA’dan alıp yükledikten sonra servislere atamayı unutmayın. Eski sertifikayı hemen silmeyin; birkaç gün bekleyip her şeyin çalıştığını doğruladıktan sonra kaldırın.

Çok Sunuculu Exchange Ortamlarında Sertifika Yönetimi

DAG (Database Availability Group) veya birden fazla Exchange sunucusu olan ortamlarda sertifika yönetimi daha dikkatli ele alınmalıdır. Her sunucu için ayrı CSR oluşturmanız gerekir ya da wildcard sertifika kullanabilirsiniz.

Wildcard sertifika kullanıyorsanız (*.domain.com gibi) bunu tüm sunuculara yüklemek için sertifikayı önce PFX olarak export etmeniz gerekir:

$thumbprint = "SERTIFIKA_THUMBPRINT"

Export-ExchangeCertificate `
  -Thumbprint $thumbprint `
  -FileName "C:Certsexchange_wildcard.pfx" `
  -Password (ConvertTo-SecureString -String "GucluBirParola123!" -AsPlainText -Force) `
  -BinaryEncoded

Sonra bu PFX dosyasını diğer Exchange sunucularına kopyalayıp import edin:

# Diğer Exchange sunucusunda çalıştırın
Import-ExchangeCertificate `
  -Server "EXCHANGE02" `
  -FileData ([System.IO.File]::ReadAllBytes("\EXCHANGE01Certsexchange_wildcard.pfx")) `
  -Password (ConvertTo-SecureString -String "GucluBirParola123!" -AsPlainText -Force)

Sık Karşılaşılan Sorunlar ve Çözümleri

OWA’ya girildiğinde sertifika uyarısı almaya devam ediyorum:

IIS servisini yeniden başlatmanız gerekebilir. Ayrıca IIS Manager’da Default Web Site ve Exchange Backend sitesine gidip SSL bindings’i kontrol edin. Bazen Exchange sertifikayı değiştirdiğinde IIS binding’i güncellemez.

# IIS servisini yeniden başlatın
Restart-Service W3SVC, MSExchangeTransport

# Binding'leri kontrol edin
Get-WebBinding -Name "Default Web Site" | Where-Object {$_.protocol -eq "https"}

Autodiscover çalışmıyor:

Sertifikada “autodiscover.domain.com” SAN kaydı olduğundan emin olun. Ayrıca Exchange’de Autodiscover servis URL’lerini kontrol edin:

Get-ClientAccessServer | Select-Object AutoDiscoverServiceInternalUri
Get-AutodiscoverVirtualDirectory | Select-Object InternalUrl, ExternalUrl

SMTP sertifika uyarısı veriyor, mail gelmiyor:

Receive Connector’lara atanan sertifikayı kontrol edin. Bazen servis ataması yapılsa bile connector bazında sertifika belirtmeniz gerekebilir:

Get-ReceiveConnector | Select-Object Name, TlsCertificateName
Set-ReceiveConnector -Identity "Default Frontend EXCHANGE01" -TlsCertificateName "<I>CN=CA Issuer<S>CN=mail.domain.com"

Sertifika zinciri eksik hatası:

Yukarıda belirttiğim gibi ara sertifikaları mutlaka yükleyin. Ek olarak şunu da deneyin: Sertifika dosyasını, ara sertifikayı ve root sertifikayı tek bir PEM dosyasında birleştirip Exchange’e verin. Bazı CA’lardan gelen bundle dosyaları bu formattadır.

Sertifika Yönetimi İçin Monitoring

Sertifika son kullanma tarihini takip etmek için basit ama etkili bir PowerShell betiği:

$exchangeServer = "EXCHANGE01"
$warningDays = 45
$criticalDays = 15
$smtpServer = "localhost"
$recipient = "[email protected]"

$certs = Get-ExchangeCertificate -Server $exchangeServer | 
  Where-Object {$_.Services -ne "None" -and $_.NotAfter -ne $null}

foreach ($cert in $certs) {
    $daysLeft = ($cert.NotAfter - (Get-Date)).Days
    
    if ($daysLeft -le $criticalDays) {
        $subject = "[KRITIK] Exchange Sertifikasi $daysLeft gun icinde sona eriyor"
        Send-MailMessage -To $recipient -From "[email protected]" `
          -Subject $subject -SmtpServer $smtpServer `
          -Body "Sertifika: $($cert.Subject) - Son Kullanma: $($cert.NotAfter)"
    }
    elseif ($daysLeft -le $warningDays) {
        $subject = "[UYARI] Exchange Sertifikasi $daysLeft gun icinde sona eriyor"
        Send-MailMessage -To $recipient -From "[email protected]" `
          -Subject $subject -SmtpServer $smtpServer `
          -Body "Sertifika: $($cert.Subject) - Son Kullanma: $($cert.NotAfter)"
    }
}

Bu betiği Task Scheduler’a haftalık çalışacak şekilde ekleyin. Sertifikanın son kullanma tarihine iki ay kala uyarı almaya başlarsanız yenileme için yeterli zamanınız olur.

Production Ortamında Dikkat Edilmesi Gerekenler

Sertifika değişikliği her ne kadar rutin bir işlem gibi görünse de production ortamında bazı kurallar şart:

  • Sertifika değişikliğini mesai saatleri dışında yapın. Değişim sırasında kısa bir kesinti yaşanabilir, özellikle IIS ve transport servisleri yeniden başlatılıyorsa.
  • Eski sertifikayı silmeden önce en az bir iş günü bekleyin. Bazı servisler önbellekte eski sertifikayı tutabilir.
  • Exchange ortamında değişiklik öncesi ve sonrası bir test mail gönderin. Hem iç hem dış hedefe.
  • DAG ortamlarında tüm üyelere sertifika yüklemeden Load Balancer üzerinden yeni sertifikayı devreye almayın.
  • Sertifika PFX’ini ve parolasını güvenli bir şekilde saklayın. Bir felaket kurtarma senaryosunda bu dosyaya ihtiyacınız olacak.

Sonuç

Exchange Server’da SSL sertifikası kurulumu ve yenileme, doğru adımlar takip edildiğinde saatler içinde tamamlanabilecek bir süreçtir. Ancak yanlış adımlar; OWA erişim sorunları, mobil cihaz bağlantı problemleri ve mail akışında kesintiler gibi ciddi sorunlara kapı aralar.

En çok vurgulamak istediğim noktalar şunlar: ara sertifikaları asla atlamayın, yenilemeyi son güne bırakmayın ve sertifika PFX yedeklerinizi düzenli alın. Monitoring betiğini kurmak için yarım saat harcarsanız, ilerleyen dönemde “sertifika neden sona ermiş” sorusunu asla kendinize sormak zorunda kalmazsınız.

Özellikle Exchange 2019 ile birlikte Microsoft’un sertifika yönetimini biraz daha kolaylaştırdığını söyleyebilirim. Ama temeller değişmiyor: CSR, import, servis ataması ve monitoring. Bu dört adımı doğru yaparsanız Exchange sertifika yönetimi sizi hiç strese sokmaz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir