Post

Derinlemesine CertUtil - In-depth CertUtil

Derinlemesine CertUtil - In-depth CertUtil

CERT Logosu

1. Giriş ve Genel Bakış

Kurumsal IT altyapılarında Public Key Infrastructure (PKI), güven zincirinin en kritik bileşenidir. Sertifikaların yönetimi, iptali, doğrulanması ve dağıtımı sürecinde görünmez ama hayati görevler üstlenir. Grafiksel araçların (MMC) yetersiz kaldığı noktada CertUtil devreye girer.

CertUtil, Windows Server’da yerleşik gelen ve CA (Certification Authority) yönetiminden sertifika doğrulamaya, CRL testlerinden yedekleme/geri yüklemeye kadar geniş bir yelpazede kullanılan komut satırı aracıdır.


2. 5N1K: CertUtil Nedir?

  • Ne?: Windows ortamında PKI yönetimi, sertifika doğrulama, CRL/AIA/CDP testleri ve CA bakım görevlerini yapan yerleşik komut satırı aracıdır.
  • Neden?: Grafik arayüzlerin gösteremediği detayları görmek, otomasyon sağlamak, hızlı sorun çözmek ve güvenlik denetimlerinde kanıt sunmak için kullanılır.
  • Nasıl?: certutil <komut> [parametreler] (Örn: certutil -store My)
  • Nerede?: Hem istemci hem sunucu makinelerde; özellikle Enterprise CA, Issuing CA, Offline Root CA ve Subordinate CA katmanlarında.
  • Ne zaman?: Sertifika yenileme, hizmet kesintisi, CRL erişim hatası, zincir doğrulama problemi veya denetim raporu hazırlanması gerektiğinde.
  • Kim?: Sistem yöneticileri, PKI yöneticileri, güvenlik analistleri, denetim ekipleri ve olay müdahale uzmanları.

3. Avantajlar ve Dezavantajlar

✅ Avantajlar❌ Dezavantajlar
Yerleşik Araçtır: Ekstra kurulum gerekmez, tüm Windows sistemlerde hazırdır.Öğrenme Eğrisi Yüksek: Komut sayısı fazla, parametreler karmaşık.
Derinlemesine Analiz: GUI’nin göremediği zincir hataları ve CRL problemlerini gösterir.Yanlış Kullanım Riski: -setreg gibi komutlar hatalı kullanılırsa servis kesintisine yol açabilir.
Otomasyon Desteği: PowerShell ve Batch ile entegre edilebilir.Yetki Gereksinimi: Kritik komutlar için CA Admin yetkisi şarttır.
CA Yönetiminde Güçlü: Yedekleme, şablon yönetimi, CRL yayımı gibi her şeyi kapsar.Çıktılar Karmaşık: -dump çıktılarını yorumlamak deneyim ister.
Denetimlerde Kurtarıcı: Hızlı kanıt sağlar.Üretim Kodunda Kullanım Önerilmez: Microsoft, live site desteği garantisi vermez.

4. Temel Komut Grupları

📂 Sertifika Depoları

Sertifikaları listelemek ve incelemek için kullanılır. Store Adları: My, CA, Root, TrustedPublisher, Remote Desktop, AIA, NTAuth.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Bilgisayarın kişisel sertifika deposunu listeler
certutil -store My

# Kullanıcı sertifika deposunu gösterir
certutil -store -user My

# Her sertifikanın zincirini doğrular
certutil -verifystore My

# AIA container'ını görüntüle
certutil -viewstore AIA

# NTAuth container'ını görüntüle
certutil -viewstore NTAuth

# Depoya sertifika ekle (TrustedPublisher)
certutil -addstore TrustedPublisher cert.cer

# Depodan sertifika sil (Seri numarası ile)
certutil -delstore My "1A 2B 3C ..."

Kullanım Senaryosu: Exchange veya IIS hizmet sertifikası görünmüyorsa -store My ile bakılır.

🌐 CRL / AIA / CDP Testleri

Zincir doğrulama ve erişim testleri.

1
2
3
4
5
6
7
8
9
10
11
# AIA/CDP linklerini test penceresinde gösterir
certutil -url cert.cer

# Zincir doğrulaması yapar ve CRL/OCSP'yi gerçek URL'den indirerek kontrol eder
certutil -urlfetch -verify cert.cer

# CRL önbelleğini temizler
certutil -urlcache * delete

# Belirli bir URL'den CRL çek ve önbelleğe al
certutil -urlcache -f http://pki.domain.com/crl/ca.crl

Örnek: “Revocation status unknown” hatasında önce -urlfetch yapılır, sorun URL erişimindeyse -urlcache * delete ile önbellek temizlenir.

🗄️ CA Veritabanı ve Şablon Yönetimi

CA yönetimi için kritik komutlar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# CA veritabanı kayıtlarını listeler
certutil -view

# CA'nın yayımladığı şablonları gösterir
certutil -catemplates

# CA registry ayarlarını getirir
certutil -getreg

# Tüm şablonları detaylı göster
certutil -v -template

# Belirli bir şablonu AD'den sorgula
certutil -dstemplate WebServer

💾 Yedekleme ve Geri Yükleme (DR)

Felaket kurtarma senaryoları.

1
2
3
4
5
6
7
8
9
10
11
12
13
# Tam yedekleme (DB + Registry + Private Key)
certutil -backup D:\CA-Backup

# Sadece CA Veritabanını yedekle (önerilen)
certutil -backupdb D:\CA-Backup\DB

# CA Anahtarını yedekle (ÇIKTI ÇOK HASSAS!)
certutil -backupkey D:\CA-Backup\Keys

# Geri yükleme
certutil -restore D:\CA-Backup
certutil -restoredb D:\CA-Backup\DB
certutil -restorekey D:\CA-Backup\Keys

Önemli: -backupkey çıktısı şifrelenmemiş ortamda saklanmamalıdır.

🔧 Özel Anahtar Onarımı (RepairStore)

Hizmet sertifikası özel anahtarıyla eşleşmiyorsa (IIS, ADFS, Exchange sorunlarında):

1
certutil -repairstore My <THUMBPRINT>

Not: Thumbprint değerini yapıştırırken boşlukları kaldırın veya tırnak içinde kullanın.

📄 Dosya Analizi ve Kod Dönüşümü

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Sertifikanın tüm ayrıntılarını ASN.1 düzeyinde gösterir
certutil -dump cert.cer

# Base64 dönüştürme (DER -> Base64)
certutil -encode file.der file.cer

# DER formatına geri çevirme (Base64 -> DER)
certutil -decode file.cer file.der

# Hex dump oluştur
certutil -encodehex input.file output.hex

# Hex'ten binary'ye
certutil -decodehex input.hex output.bin

# Dosya Hash değerini hesapla (MD5)
certutil -hashfile dosya.exe MD5

# Dosya Hash değerini hesapla (SHA256)
certutil -hashfile dosya.exe SHA256

🔑 PFX / P12 Yönetimi

Özel anahtar içeren PFX dosyalarının yönetimi:

1
2
3
4
5
6
7
8
# PFX dosyasını kişisel depoya (My) içe aktar
certutil -user -p "Sifre123" -importpfx my.pfx

# Sertifikayı ve özel anahtarı PFX olarak dışa aktar (NoCA: Zinciri dahil etme)
certutil -user -p "Sifre123" -exportpfx My <Serial> my.pfx NoCA

# PFX dosyasının şifresini kontrol et / içeriğini görüntüle
certutil -dump -p "Sifre123" my.pfx

5. İleri Seviye Komutlar

🔐 CA Registry Ayarları (setreg/getreg)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# CRL yayım süresini ayarla (1 hafta)
certutil -setreg CA\CRLPeriodUnits 1
certutil -setreg CA\CRLPeriod "Weeks"

# Delta CRL ayarları (1 gün)
certutil -setreg CA\CRLDeltaPeriodUnits 1
certutil -setreg CA\CRLDeltaPeriod "Days"

# CRL Overlap Period (12 saat)
certutil -setreg CA\CRLOverlapPeriodUnits 12
certutil -setreg CA\CRLOverlapPeriod "Hours"

# Sertifika geçerlilik süresi (5 yıl)
certutil -setreg CA\ValidityPeriodUnits 5
certutil -setreg CA\ValidityPeriod "Years"

# Tam denetim etkinleştir
certutil -setreg CA\AuditFilter 127

# Ayarları kontrol et
certutil -getreg CA\CRLPeriodUnits

⚠️ Kritik: -setreg sonrası mutlaka net stop certsvc && net start certsvc ile servis yeniden başlatılmalıdır.

📡 Active Directory Entegrasyonu

1
2
3
4
5
6
7
8
9
10
11
# Root CA sertifikasını AD'ye yayımla
certutil -dspublish -f RootCA.cer RootCA

# Enterprise CA bilgilerini görüntüle
certutil -EntInfo DOMAIN\CASERVER$

# Domain Controller bilgilerini göster
certutil -DCInfo

# AD'deki PKI nesnelerini göster
certutil -ds

🔍 Gelişmiş Sorgulama ve Raporlama

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Bekleyen talepleri listele
certutil -view -restrict "Request.Disposition=9" -out "RequestID,RequesterName,CommonName"

# İptal edilmiş sertifikaları listele
certutil -view -restrict "Request.Disposition=21" -out "RequestID,SerialNumber,RevokedWhen"

# Belirli tarih aralığındaki sertifikaları getir
certutil -view -restrict "NotBefore>=01/01/2024,NotBefore<=12/31/2024" csv

# Süresi dolmuş sertifikaları bul
certutil -view -restrict "NotAfter<=$(Get-Date -Format 'MM/dd/yyyy')" -out "CommonName,NotAfter"

# Bekleyen (Pending) bir isteği onayla (Issue)
certutil -resubmit <RequestID>

# Bekleyen bir isteği reddet (Deny)
certutil -deny <RequestID>

Disposition Kodları (Sertifika Durumları):

KodDurumAçıklama
9PendingBekleyen (onay bekliyor)
15CA DeniedCA tarafından reddedilmiş
20IssuedVerilmiş (aktif)
21Revokedİptal edilmiş
30FailedBaşarısız
31Under SubmissionGönderim sürecinde

🛠️ CSP/KSP Yönetimi

1
2
3
4
5
6
7
8
# Tüm CSP'leri listele
certutil -csplist

# CSP testleri çalıştır
certutil -csptest

# Belirli bir CSP ile anahtar oluştur
certutil -key -csp "Microsoft Software Key Storage Provider"

🔄 Sertifika İşlemleri

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Sertifika iptal et (sebep kodu: 1=KeyCompromise)
certutil -revoke 1A2B3C4D5E6F 1

# Yeni CRL yayımla
certutil -crl

# Delta CRL yayımla
certutil -crl +CRL_DELTA

# CA sertifikasını al
certutil -ca.cert ca_cert.cer

# CA zincirini al
certutil -ca.chain ca_chain.p7b

# CA'ya ping at
certutil -ping
certutil -config "CASERVER\CA Name" -ping

İptal Sebep Kodları:

KodSebepKullanım Durumu
0UnspecifiedGenel iptal (sebep belirtilmemiş)
1KeyCompromiseÖzel anahtar ele geçirilmiş
2CACompromiseCA’nın kendisi tehlikeye girmiş
3AffiliationChangedKullanıcı kuruluştan ayrılmış
4SupersededSertifika yenisiyle değiştirilmiş
5CessationOfOperationHizmet durdurulmuş
6CertificateHoldGeçici askıya alma (geri alınabilir)

🔬 ASN.1 ve Hata Analizi

1
2
3
4
5
6
7
8
9
10
11
12
# ASN.1 formatında sertifika parse et
certutil -asn cert.cer

# Detaylı ASN.1 çıktısı
certutil -v -asn cert.cer

# Hata kodunu çöz (HRESULT)
certutil -error 0x80090016
certutil -error 2148073494

# CRL dosyasını ASN.1 olarak incele
certutil -asn ca.crl

Sık Karşılaşılan Hata Kodları (HRESULT)

Kod (Hex)Kod (Dec)Anlamı
0x80092013-2146885613Revocation server offline (CRL erişilemiyor)
0x80092012-2146885614Revocation function unable to check revocation (Zincir hatası)
0x80090016-2146893802Keyset does not exist (Özel anahtar yok/erişilemiyor)
0x800B0101-2146762495A required certificate is not within its validity period (Süresi dolmuş)
0x800B0109-2146762487Chain terminated in a root certificate which is not trusted (Root güvenilmiyor)

📝 CertReq Entegrasyonu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Yeni sertifika talebi oluştur (INF dosyasından)
certreq -new request.inf request.req

# Talebi CA'ya gönder
certreq -submit request.req

# Bekleyen talebi al
certreq -retrieve <RequestID> cert.cer

# Sertifikayı yükle
certreq -accept cert.cer

# P7B zincirini görüntüle
certutil -dump -v cert.p7b

6. Kurumsal PKI Yönetimi

🏗️ Multi-Tier PKI Mimarisi

Kurumsal ortamlarda önerilen yapı:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌─────────────────────────┐
│   Offline Root CA       │  (Fiziksel güvenlik, ağdan izole)
│   Validity: 20 yıl      │
└───────────┬─────────────┘
            │
    ┌───────┴────────┐
    │                │
┌───▼────────┐  ┌───▼────────┐
│ Policy CA  │  │ Policy CA  │  (Offline/Semi-offline)
│ (Opsiyonel)│  │ (Opsiyonel)│
└───┬────────┘  └───┬────────┘
    │               │
┌───▼─────────────────▼───┐
│   Issuing CA (Online)   │  (7/24 aktif, sertifika dağıtır)
│   Validity: 5 yıl       │
└─────────────────────────┘

📋 CAPolicy.inf Örneği

Root CA kurulumu öncesi C:\Windows\CAPolicy.inf dosyası:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[Version]
Signature="$Windows NT$"

[PolicyStatementExtension]
Policies=AllIssuancePolicy
Critical=False

[AllIssuancePolicy]
OID=2.5.29.32.0

[BasicConstraintsExtension]
PathLength=2
Critical=True

[certsrv_server]
RenewalKeyLength=4096
RenewalValidityPeriod=Years
RenewalValidityPeriodUnits=20
CRLPeriod=Years
CRLPeriodUnits=10
LoadDefaultTemplates=0
AlternateSignatureAlgorithm=1

🌐 CDP/AIA URL Yapılandırması

1
2
3
4
5
6
7
8
9
# CRL Distribution Point ayarla
certutil -setreg CA\CRLPublicationURLs "1:C:\Windows\system32\CertSrv\CertEnroll\%3%8%9.crl\n10:ldap:///CN=%7%8,CN=%2,CN=CDP,CN=Public Key Services,CN=Services,%6%10\n2:http://pki.domain.com/crl/%3%8%9.crl"

# AIA (Authority Information Access) ayarla
certutil -setreg CA\CACertPublicationURLs "1:C:\Windows\system32\CertSrv\CertEnroll\%1_%3%4.crt\n2:ldap:///CN=%7,CN=AIA,CN=Public Key Services,CN=Services,%6%11\n2:http://pki.domain.com/aia/%1_%3%4.crt"

# Ayarları kontrol et
certutil -getreg CA\CRLPublicationURLs
certutil -getreg CA\CACertPublicationURLs

URL Değişkenleri:

  • %1 = CA adı
  • %2 = Domain adı
  • %3 = CA sanitized name
  • %8 = CRL suffix
  • %9 = Delta CRL suffix

7. Otomasyon ve Scripting

📜 PowerShell ile Toplu Sertifika Kontrolü

1
2
3
4
5
6
# Tüm sertifikaları kontrol et ve süresi dolacakları tespit et
$certs = certutil -store My | Select-String "Serial Number:"
foreach ($cert in $certs) {
    $serial = $cert -replace ".*: ", ""
    certutil -verify -urlfetch $serial
}

⚡ Auto-Enrollment Tetikleme (Pulse)

GPO ile dağıtılan sertifikaların anında alınmasını sağlamak için kullanılan sihirli komut:

1
2
3
4
5
# Auto-enrollment olayını tetikle (Machine context)
certutil -pulse

# User context için
certutil -user -pulse

🔄 Otomatik CRL Yenileme Script’i

1
2
3
4
5
6
7
8
9
10
# Günlük CRL yenileme (Task Scheduler ile çalıştır)
$logFile = "C:\Logs\CRL_Publish_$(Get-Date -Format 'yyyyMMdd').log"

try {
    certutil -crl | Out-File -Append $logFile
    Write-Output "$(Get-Date): CRL başarıyla yayımlandı" | Out-File -Append $logFile
} catch {
    Write-Output "$(Get-Date): HATA - $_" | Out-File -Append $logFile
    Send-MailMessage -To "[email protected]" -Subject "CRL Yayım Hatası" -Body $_
}

📊 CA Veritabanı Raporu

1
2
3
4
5
# Son 30 günde verilen sertifikaları CSV'ye aktar
$startDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$endDate = (Get-Date).ToString("MM/dd/yyyy")

certutil -view -restrict "NotBefore>=$startDate,NotBefore<=$endDate" csv -out "RequestID,RequesterName,CommonName,NotBefore,NotAfter" > "C:\Reports\Certificates_Last30Days.csv"

🔐 Toplu Sertifika İptali

1
2
3
4
5
6
7
8
9
10
11
12
13
# Belirli bir kullanıcının tüm sertifikalarını iptal et
$user = "DOMAIN\username"
$certs = certutil -view -restrict "RequesterName=$user" -out "SerialNumber"

foreach ($serial in $certs) {
    if ($serial -match "^[0-9a-f]+$") {
        certutil -revoke $serial 1  # 1 = KeyCompromise
        Write-Output "İptal edildi: $serial"
    }
}

# Yeni CRL yayımla
certutil -crl

8. Gerçek Hayat Senaryoları

Senaryo 1: Exchange Hizmet Kesintisi

Sorun: Exchange OWA açılmıyor, kullanıcılar “sertifika hatası” alıyor.

Çözüm Adımları:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. Sertifikayı kontrol et
certutil -store My

# 2. Özel anahtar eşleşmesini kontrol et (Key Provider Name olmalı)
certutil -store My | Select-String -Context 0,15 "Subject: CN=mail.domain.com"

# 3. Eşleşme yoksa onar
certutil -repairstore My <thumbprint>

# 4. Zinciri doğrula
certutil -verify -urlfetch mail_cert.cer

# 5. IIS'i yeniden başlat
iisreset

Senaryo 2: ADFS Login Sorunu

Sorun: Kullanıcılar ADFS üzerinden oturum açamıyor.

Çözüm:

1
2
3
4
5
6
7
8
9
10
11
12
# 1. ADFS sertifikasını doğrula
certutil -verify -urlfetch adfs.cer

# 2. CRL erişimini test et
certutil -url adfs.cer

# 3. CRL URL'si 404 dönüyorsa, IIS'te CRL yayınını kontrol et
# 4. Önbelleği temizle
certutil -urlcache * delete

# 5. ADFS servisini yeniden başlat
Restart-Service adfssrv

Senaryo 3: LDAPS Sertifika Problemi

Sorun: Uygulama DC’ye LDAPS (636) üzerinden bağlanamıyor.

Çözüm:

1
2
3
4
5
6
7
8
9
# 1. DC sertifikasını kontrol et
certutil -store My

# 2. EKU kontrolü (Server Authentication olmalı)
certutil -dump dc_cert.cer | Select-String "Enhanced Key Usage"

# 3. Eksikse doğru şablonla yeni sertifika enroll et
# 4. DC'yi yeniden başlat
Restart-Computer -Force

Senaryo 4: Toplu Sertifika Süresi Dolumu

Sorun: 100+ sertifikanın süresi aynı anda dolacak.

Çözüm:

1
2
3
4
5
6
# 1. Süresi dolacak sertifikaları tespit et
$expiryDate = (Get-Date).AddDays(30).ToString("MM/dd/yyyy")
certutil -view -restrict "NotAfter<=$expiryDate" -out "CommonName,NotAfter,RequesterName" > expiring.txt

# 2. Otomatik yenileme için GPO ayarla
# 3. Manuel yenileme gerekiyorsa kullanıcılara bildirim gönder

Senaryo 5: CA Veritabanı Bozulması

Sorun: CA hizmeti başlamıyor, veritabanı hatası veriyor.

Çözüm:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. Servisi durdur
net stop certsvc

# 2. Veritabanı tutarlılığını kontrol et
esentutl /g "C:\Windows\system32\CertLog\CA_Name.edb"

# 3. Hata varsa onar
esentutl /p "C:\Windows\system32\CertLog\CA_Name.edb"

# 4. Defragmente et
esentutl /d "C:\Windows\system32\CertLog\CA_Name.edb"

# 5. Servisi başlat
net start certsvc

# 6. Başarısızsa son yedekten geri yükle
certutil -restoredb D:\CA-Backup\DB

9. Sorun Giderme Karar Ağacı

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Sertifika Sorunu mu?
│
├─ Sertifika bulunamıyor
│  ├─ certutil -store My
│  └─ certutil -verifystore My
│
├─ Zincir doğrulama hatası
│  ├─ certutil -verify -urlfetch cert.cer
│  ├─ certutil -url cert.cer
│  └─ certutil -urlcache * delete
│
├─ Özel anahtar eşleşmiyor
│  └─ certutil -repairstore My <thumbprint>
│
├─ CRL erişim hatası
│  ├─ certutil -urlcache -f http://crl.url
│  └─ IIS/Web sunucu kontrolü
│
├─ CA servisi başlamıyor
│  ├─ Event Viewer kontrol
│  ├─ certutil -getreg (ayar kontrolü)
│  └─ certutil -restoredb (son çare)
│
└─ Performans sorunu
   ├─ CA veritabanı boyutu kontrol
   ├─ esentutl /d (defragment)
   └─ Eski kayıtları arşivle

10. Performans ve Optimizasyon

🚀 CA Veritabanı Optimizasyonu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Veritabanı boyutunu kontrol et
Get-Item "C:\Windows\system32\CertLog\*.edb" | Select-Object Name, @{N="SizeGB";E={[math]::Round($_.Length/1GB, 2)}}

# Offline defragmentasyon (servis durdurulmalı)
net stop certsvc
esentutl /d "C:\Windows\system32\CertLog\CA_Name.edb"
net start certsvc

# Online yedekleme sırasında log dosyalarını temizle
certutil -backupdb D:\Backup

# Eski istekleri arşivle (1 yıldan eski)
$cutoffDate = (Get-Date).AddYears(-1).ToString("MM/dd/yyyy")
certutil -view -restrict "NotBefore<$cutoffDate,Request.Disposition=20" -out "RequestID" | 
  ForEach-Object { certutil -deleterow $_ }

⚡ CRL Performans Ayarları

1
2
3
4
5
6
7
8
9
10
# CRL boyutunu küçült (Delta CRL kullan)
certutil -setreg CA\CRLDeltaPeriodUnits 1
certutil -setreg CA\CRLDeltaPeriod "Hours"

# CRL yayım zamanlaması (düşük yoğunluk saatleri)
# Task Scheduler ile 02:00'de otomatik yayımla

# Base CRL'yi uzun tutarsanız delta daha küçük olur
certutil -setreg CA\CRLPeriodUnits 26
certutil -setreg CA\CRLPeriod "Weeks"

🔧 OCSP Yapılandırması

1
2
3
4
5
6
7
8
9
10
11
12
# OCSP Responder kurulumu (CA'dan ayrı sunucu)
Install-WindowsFeature -Name ADCS-Online-Cert
Install-AdcsOnlineResponder

# OCSP yanıt imzalama sertifikası şablonu oluştur
# MMC > Certificate Templates > Manage > Duplicate "OCSP Response Signing"

# CA'da OCSP extension ekle
certutil -setreg CA\CRLPublicationURLs "...\n32:http://ocsp.domain.com/ocsp"

# OCSP test et
certutil -url cert.cer

11. Event Log ve İzleme

📊 Kritik Event ID’ler

Event IDKaynakAçıklamaÖncelik
4887CertificationAuthorityCA başlatıldıInfo
4888CertificationAuthorityCA durdurulduWarning
100CertificationAuthorityBaşarısız sertifika isteğiWarning
3CertificationAuthoritySertifika veritabanı erişim hatasıCritical
44CertificationAuthorityCRL yayımlandıInfo
53CertificationAuthorityCRL yayım hatasıCritical
80CertificationAuthoritySertifika iptal edildiWarning

🔍 Event Log Sorguları

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Son 24 saatteki CA hatalarını göster
Get-WinEvent -FilterHashtable @{
    LogName='Application'
    ProviderName='Microsoft-Windows-CertificationAuthority'
    Level=2  # Error
    StartTime=(Get-Date).AddDays(-1)
} | Select-Object TimeCreated, Id, Message | Format-Table -AutoSize

# Başarısız sertifika taleplerini bul
Get-WinEvent -FilterHashtable @{
    LogName='Application'
    ProviderName='Microsoft-Windows-CertificationAuthority'
    Id=100
} | Select-Object -First 10

# CRL yayım geçmişi
Get-WinEvent -FilterHashtable @{
    LogName='Application'
    ProviderName='Microsoft-Windows-CertificationAuthority'
    Id=44,53
} | Select-Object TimeCreated, Id, Message

📈 Proaktif İzleme Script’i

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# CA sağlık kontrolü ve alarm
$issues = @()

# 1. CRL geçerlilik kontrolü
$crl = certutil -dump ca.crl | Select-String "NextUpdate"
if ($crl -match "(\d{2}/\d{2}/\d{4}.*)") {
    $nextUpdate = [datetime]::Parse($matches[1])
    if ($nextUpdate -lt (Get-Date).AddHours(24)) {
        $issues += "CRL 24 saat içinde süresi dolacak!"
    }
}

# 2. Veritabanı boyutu kontrolü (>10GB uyarı)
$dbSize = (Get-Item "C:\Windows\system32\CertLog\*.edb").Length / 1GB
if ($dbSize -gt 10) {
    $issues += "Veritabanı boyutu ${dbSize}GB, defragmentasyon gerekli!"
}

# 3. Servis durumu
if ((Get-Service certsvc).Status -ne 'Running') {
    $issues += "CA servisi çalışmıyor!"
}

# 4. Yedekleme kontrolü
$lastBackup = (Get-ChildItem "D:\CA-Backup" | Sort-Object LastWriteTime -Descending | Select-Object -First 1).LastWriteTime
if ($lastBackup -lt (Get-Date).AddDays(-7)) {
    $issues += "Son yedekleme 7 günden eski: $lastBackup"
}

# Sorun varsa e-posta gönder
if ($issues.Count -gt 0) {
    $body = $issues -join "`n"
    Send-MailMessage -To "[email protected]" -Subject "CA Sağlık Uyarısı" -Body $body -SmtpServer "smtp.domain.com"
}

12. Sık Yapılan Hatalar

❌ Hata 1: Servis Restart Unutulması

Sorun: -setreg ile ayar değiştirildi ama CertSvc restart edilmedi.

Belirti: Yeni ayarlar uygulanmıyor, CRL süresi hala eski.

Çözüm:

1
2
3
net stop certsvc && net start certsvc
# VEYA
Restart-Service certsvc

❌ Hata 2: CDP/AIA URL’lerinde İç Sunucu Adı

Sorun: CDP URL’sinde http://INTERNALSERVER/crl/ca.crl gibi iç sunucu adı kullanılmış.

Belirti: Dış ağdan sertifika doğrulaması başarısız.

Çözüm:

1
2
# Public DNS kullan
certutil -setreg CA\CRLPublicationURLs "...\n2:http://pki.publicdomain.com/crl/%3%8%9.crl"

❌ Hata 3: Yedekleme Olmadan -setreg Kullanımı

Sorun: Registry değişikliği öncesi yedek alınmadı.

Çözüm:

1
2
3
4
# ÖNCE yedek al
certutil -backup D:\Emergency-Backup
# SONRA değişiklik yap
certutil -setreg CA\CRLPeriodUnits 1

❌ Hata 4: Root CA’yı Domain’e Katma

Sorun: Offline Root CA domain member olarak kurulmuş.

Belirti: Network erişimi nedeniyle offline değil.

Çözüm: Root CA’yı standalone/workgroup olarak kur, ağdan fiziksel olarak izole et.

❌ Hata 5: Varsayılan Şablonları Üretimde Kullanma

Sorun: “User”, “Computer” gibi default şablonlar direkt kullanılmış.

Çözüm: Duplicate edip kuruma özel OID ekle:

1
2
# Şablon detaylarını OID ve ACL dahil görüntüle
certutil -v -dstemplate "MyCompany-Computer"

Not: Şablon kopyalama işlemi grafik arayüzden veya certutil -setcatemplates komutu ile CA’ya ekleme şeklinde yapılır.

❌ Hata 6: CRL Overlap Period Ayarlanmaması

Sorun: CRL publish olduktan hemen sonra eski CRL geçersiz oluyor.

Belirti: Zaman senkronizasyon farklılıklarında doğrulama hatası.

Çözüm:

1
2
3
# En az 6-12 saat overlap ver
certutil -setreg CA\CRLOverlapPeriodUnits 12
certutil -setreg CA\CRLOverlapPeriod "Hours"

❌ Hata 7: PathLength Kısıtlaması Unutma

Sorun: Root CA sertifikasında PathLength=0 veya eksik.

Belirti: Subordinate CA kurulamıyor.

Çözüm: CAPolicy.inf’te PathLength=2 (veya daha fazla) ayarla.

💡 İpucu: Otomasyon ve -f Parametresi

Komut dosyalarında (script) onay pencerelerini atlamak ve üzerine yazma işlemlerini zorlamak için -f (force) parametresini kullanın:

1
2
# Örnek: Onay almadan kök sertifika ekle
certutil -f -addstore Root ca.cer

13. Karşılaştırma Tablosu

Araç / YöntemAvantajlarDezavantajlarKullanım Alanı
CertUtilYerleşik, CA yönetimi, CRL testleri, yedekleme, detaylı analiz.Öğrenme eğrisi yüksek, karmaşık çıktılar.Günlük operasyon, denetim, olay çözümü.
PowerShell (PSPKI)Nesne tabanlı, script otomasyonu, raporlamaya uygun.Bazı düşük seviye CRL/AIA testlerinde yetersiz.Rutin raporlama, dashboard entegrasyonu.
OpenSSLPlatform bağımsız, güçlü kripto analizi.Windows AD CS ile entegre değil.Linux/Unix tarafı, çapraz platform kontroller.
MMC KonsollarıKolay kullanım, grafiksel arayüz.Otomasyon yok, detaylı tanılama sınırlı.Eğitim, basit inceleme, GUI tercihi.
PKIView.mscCA sağlık durumu görsel takip.Sadece görüntüleme, düzeltme yok.Proaktif izleme, sağlık kontrolleri.

14. Güvenlik ve Best Practices

🔒 Güvenlik Önlemleri

  1. Yetki Yönetimi: CA üzerinde CertUtil kullanacak kişilerin rolleri sınırlı olmalı. “Herkes her komutu çalıştırabilir” olmamalı.
  2. Servis Restart: -setreg sonrası CertSvc yeniden başlatılmalıdır. Restart edilmezse değişiklik uygulanmaz.
  3. Proxy / WAF Etkisi: CRL/AIA testlerinde proxy araya giriyorsa -urlfetch yanlış sonuç dönebilir.
  4. DR Testleri: Yedekleme/geri yükleme komutları (-backupdb, -backupkey) mutlaka test edilmelidir.
  5. Anahtar Güvenliği: -backupkey çıktıları çok hassastır, kasada saklanmalı ve erişim loglanmalıdır.

📐 Mimari Best Practices

  1. Multi-Tier PKI: 2-tier veya 3-tier mimari kullanın (Offline Root + Online Issuing).
  2. Offline Root CA: Root CA fiziksel güvenlikli ortamda, ağdan izole tutulmalı.
  3. CAPolicy.inf Kullanımı: CA kurulumu öncesi mutlaka hazırlayın.
  4. CDP/AIA URL’leri: İç sunucu adları yerine public erişilebilir URL’ler kullanın.
  5. Düzenli Yedekleme: Günlük otomatik yedekleme + aylık offline yedekleme.
  6. Rol Ayrımı: CA Admin, Certificate Manager, Auditor rollerini ayırın.
  7. NTP Senkronizasyonu: Tüm CA sunucuları güvenilir NTP kaynağına senkron olmalı.
  8. CA’yı DC’ye Kurmayın: Güvenlik riski oluşturur, ayrı sunucu kullanın.
  9. Varsayılan Şablonları Kullanmayın: Kuruma özel OID’ler ve şablonlar oluşturun.
  10. Denetim Etkin: AuditFilter=127 ile tam denetim aktif olmalı.

🔍 İzleme ve Bakım

1
2
3
4
5
6
7
8
9
# Haftalık sağlık kontrolü scripti
$healthCheck = @{
    "CA Service Status" = (Get-Service certsvc).Status
    "CRL Validity" = certutil -dump ca.crl | Select-String "NextUpdate"
    "Database Size" = (Get-Item "C:\Windows\system32\CertLog\*.edb").Length / 1GB
    "Last Backup" = (Get-ChildItem "D:\CA-Backup" | Sort-Object LastWriteTime -Descending | Select-Object -First 1).LastWriteTime
}

$healthCheck | Format-Table -AutoSize

15. Komut Referans Tablosu

KategoriKomutAçıklamaÖrnek
Yardımcertutil -?Temel yardımcertutil -?
 certutil -v -?Detaylı yardım (gizli komutlar dahil)certutil -v -?
Depocertutil -storeSertifika deposunu listelecertutil -store My
 certutil -verifystoreDepo doğrulamacertutil -verifystore Root
 certutil -addstoreSertifika eklecertutil -addstore Root ca.cer
 certutil -delstoreSertifika silcertutil -delstore My <serial>
 certutil -importpfxPFX içe aktarcertutil -importpfx my.pfx
 certutil -exportpfxPFX dışa aktarcertutil -exportpfx My <seri> my.pfx
Doğrulamacertutil -verifySertifika doğrulacertutil -verify cert.cer
 certutil -urlfetchURL’den CRL/AIA çekcertutil -urlfetch -verify cert.cer
 certutil -urlURL testlericertutil -url cert.cer
CRLcertutil -crlYeni CRL yayımlacertutil -crl
 certutil -getcrlCRL indircertutil -getcrl ca.crl
 certutil -urlcacheURL önbellek yönetimicertutil -urlcache * delete
CA Yönetimcertutil -viewCA veritabanı sorgulacertutil -view -restrict "Disposition=20"
 certutil -resubmitİsteği onaylacertutil -resubmit 1234
 certutil -denyİsteği reddetcertutil -deny 1234
 certutil -revokeSertifika iptal etcertutil -revoke 1A2B3C 1
 certutil -catemplatesŞablonları listelecertutil -catemplates
 certutil -pingCA bağlantı testicertutil -ping
Registrycertutil -setregRegistry ayarı değiştircertutil -setreg CA\CRLPeriodUnits 1
 certutil -getregRegistry ayarı okucertutil -getreg CA\CRLPeriodUnits
Yedeklemecertutil -backupTam yedeklemecertutil -backup D:\Backup
 certutil -backupdbSadece DB yedeklecertutil -backupdb D:\Backup\DB
 certutil -backupkeyAnahtar yedeklecertutil -backupkey D:\Backup\Key
 certutil -restoreGeri yüklecertutil -restore D:\Backup
Dosyacertutil -dumpSertifika detaylarıcertutil -dump cert.cer
 certutil -encodeBase64 encodecertutil -encode file.der file.cer
 certutil -decodeBase64 decodecertutil -decode file.cer file.der
 certutil -hashfileDosya hash hesaplacertutil -hashfile file.exe SHA256
ADcertutil -dspublishAD’ye yayımlacertutil -dspublish -f root.cer RootCA
 certutil -dstemplateŞablon bilgisicertutil -dstemplate WebServer
 certutil -EntInfoEnterprise CA bilgisicertutil -EntInfo DOMAIN\CA$
 certutil -DCInfoDC bilgisicertutil -DCInfo
Diğercertutil -repairstoreAnahtar eşleştircertutil -repairstore My <thumbprint>
 certutil -csplistCSP listelecertutil -csplist
 certutil -templateTüm şablonlarcertutil -template
 certutil -errorHata kodu açıklamasıcertutil -error 0x80090016
 certutil -pulseAuto-enrollment tetiklecertutil -pulse

16. Kapanış

PKI, bir kurumun güven zincirini temsil eder. Zincirin en zayıf halkası, tüm yapıyı tehlikeye atabilir. CertUtil, bu zincirin her halkasını test etmek, doğrulamak ve gerektiğinde onarmak için en kritik silahtır. Sadece bir araç değil, güvenin sürdürülebilirliğinin garantisidir.

CTA (Call to Action): Bugün ortamınızdaki kritik sertifikaları kontrol edin:

1
certutil -verify -urlfetch yourcert.cer

Thnx: Tuğrul Kılıç (Medium) - Adam Bertram www.adamtheautomator.com

This post is licensed under CC BY 4.0 by the author.