Sistem/DevOps•6 dk okuma

Şirket Web Siteleri ve İç Servislerin SSL Sertifika Sürelerini 30 Gün Önceden Tarayıp Uyaran PowerShell Denetçisi

Süresi dolan bir SSL sertifikası nedeniyle web sitesinin 'Bağlantınız Güvenli Değil' kırmızı ekranı vermesini engelleyen, onlarca iç ve dış servisin sertifika bitiş tarihini tarayıp Teams/Slack'e raporlayan otomasyon.

AE

Ahmet Ertekin

02 October 2022

Şirket Web Siteleri ve İç Servislerin SSL Sertifika Sürelerini 30 Gün Önceden Tarayıp Uyaran PowerShell Denetçisi

Şirket Web Siteleri ve İç Servislerin SSL Sertifika Sürelerini 30 Gün Önceden Tarayıp Uyaran PowerShell Denetçisi

Bir şirketin karşılaşabileceği en utanç verici anlardan biri, ana e-ticaret sitesinin, kurumsal web sayfasının veya müşteri portalının bir sabah aniden kırmızı ekranla "Bu siteye bağlantınız güvenli değil - Sertifikanın süresi doldu" uyarısı vermesidir. Müşteriler panikler, satışlar durur ve yöneticiler sertifikanın ne zaman bittiğini kimsenin takip etmediğini fark eder. Şirket bünyesindeki onlarca SSL/TLS sertifikasını takvimde elle takip etmek yerine, süresi 30 günün altına düşenleri her pazartesi raporlayan PowerShell SSL Denetim Aracı.

1. TCP Handshake Üzerinden Uzaktan Sertifika Okuma

Bu aracın güzelliği, hedef sunucunun içine girmeye gerek duymamasıdır; dışarıdan bir tarayıcı gibi HTTPS (Port 443) bağlantısı kurarak sunucunun sunduğu sertifikanın bitiş tarihini milisaniyeler içinde okur.

2. Üretim Seviyesinde PowerShell SSL Tarayıcısı

$TargetDomains = @(
    "holding.com.tr",
    "b2b.holding.com.tr",
    "vpn.holding.com.tr:8443",
    "mail.holding.com.tr",
    "odeme.holding.com.tr"
)

$WarningThresholdDays = 30
$Report = @()

foreach ($Target in $TargetDomains) {
    $parts = $Target.Split(":")
    $HostName = $parts[0]
    $Port = if ($parts.Length -gt 1) { [int]$parts[1] } else { 443 }

    try {
        $tcpClient = New-Object System.Net.Sockets.TcpClient
        $tcpClient.Connect($HostName, $Port)
        
        $sslStream = New-Object System.Net.Security.SslStream($tcpClient.GetStream(), $false, { $true })
        $sslStream.AuthenticateAsClient($HostName)
        
        $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($sslStream.RemoteCertificate)
        
        $DaysRemaining = ($cert.NotAfter - (Get-Date)).Days
        $Status = if ($DaysRemaining -lt 0) { "SÜRESİ DOLMUŞ!" } elseif ($DaysRemaining -le $WarningThresholdDays) { "KRİTİK UYARI" } else { "GÜVENLİ" }

        $Report += [PSCustomObject]@{
            Hedef           = $Target
            Yayınlayan      = $cert.Issuer
            BitişTarihi     = $cert.NotAfter.ToString("yyyy-MM-dd")
            KalanGün        = $DaysRemaining
            Durum           = $Status
        }

        $sslStream.Close()
        $tcpClient.Close()
    }
    catch {
        $Report += [PSCustomObject]@{
            Hedef           = $Target
            Yayınlayan      = "HATA"
            BitişTarihi     = "HATA"
            KalanGün        = -999
            Durum           = "ERİŞİLEMEDİ: $($_.Exception.Message)"
        }
    }
}

# Sonuçları Konsola Renkli Basma
$Report | Format-Table -AutoSize

3. Microsoft Teams ve E-Posta Bildirimi

Eğer KalanGün 30 günden küçükse, script Microsoft Teams webhook'una kırmızı bir alarm kartı atar: "DİKKAT: odeme.holding.com.tr sertifikasının süresi 14 gün sonra doluyor! Lütfen Sectigo/DigiCert panelinden yenileme yapınız."

Karşılaşılan Kritik Hatalar ve Çözüm İpuçları

  • SNI (Server Name Indication) Eksikliği: Birden fazla sitenin aynı IP'yi paylaştığı sunucularda AuthenticateAsClient($HostName) fonksiyonu doğru FQDN ile çağrılmazsa varsayılan yanlış sertifika dönebilir. Scriptimiz SNI başlığını doğru gönderecek şekilde tasarlanmıştır.

Mühendis Notu

Bu scripti her pazartesi sabahı çalışacak şekilde zamanlayın. Şirketinizdeki hiçbir SSL sertifikası bir daha asla sürpriz bir şekilde dolmaz ve hiçbir müşteriniz o kırmızı güvenlik uyarısını görmez.