GCP Certificate Manager ile SSL Sertifika Yönetimi
SSL sertifika yönetimi, her sysadmin’in başını ağrıtan konulardan biri. Sertifika süresi dolmuş, servis çökmüş, gece 2’de telefon çalıyor… Bu senaryoyu hepimiz yaşadık. GCP Certificate Manager, Google Cloud’un bu problemi otomatize etmek için sunduğu managed bir çözüm. Let’s Encrypt’in sağladığı otomatik yenilemenin bir üst versiyonu gibi düşünebilirsiniz, ancak büyük ölçekli altyapılar ve enterprise ihtiyaçlar için tasarlanmış.
Bu yazıda Certificate Manager’ı sıfırdan kuruyoruz, DNS ile HTTP tabanlı doğrulama yöntemlerini inceliyoruz ve gerçek dünya senaryolarında nasıl kullanacağımızı adım adım görüyoruz.
Certificate Manager Nedir ve Neden Kullanmalıyız?
Klasik yaklaşımda SSL sertifikalarını ya manuel alıp yönetiyordunuz ya da Compute Engine üzerinde Certbot çalıştırıyordunuz. Load balancer’larınız varsa, her birini ayrı ayrı yapılandırmanız gerekiyordu. Onlarca domain, yüzlerce sertifika… Bir yerde mutlaka bir şeyler kaçıyor.
Certificate Manager bu karmaşıklığı ortadan kaldırıyor. Google-managed sertifikalar ile sertifika alma, yenileme ve dağıtım süreçlerini tamamen Google’a devrediyorsunuz. Aynı zamanda kendi CA’nızdan aldığınız sertifikaları da sisteme dahil edebilirsiniz.
Temel avantajlar şunlar:
- Otomatik yenileme: Sertifikalar süresi dolmadan önce otomatik yenileniyor, siz hiçbir şey yapmıyorsunuz
- Merkezi yönetim: Tüm sertifikalarınızı tek bir API üzerinden yönetiyorsunuz
- Ölçeklenebilirlik: Wildcard sertifikalar dahil yüzlerce domaini aynı anda yönetebilirsiniz
- Load balancer entegrasyonu: Global ve regional load balancer’larla native entegrasyon
- Certificate Map: Birden fazla sertifikayı mantıksal gruplar halinde organize edebilirsiniz
Gereksinimler ve Hazırlık
Başlamadan önce birkaç şeyi hazır etmeniz gerekiyor.
gcloud CLI kurulu ve yapılandırılmış olmalı. Proje ID’nizi ve kullanıcı hesabınızı ayarlayın:
# Aktif proje kontrolü
gcloud config get-value project
# Proje ayarlama
gcloud config set project PROJECT_ID
# Gerekli API'ları etkinleştirme
gcloud services enable certificatemanager.googleapis.com
gcloud services enable dns.googleapis.com
IAM tarafında roles/certificatemanager.editor rolüne ihtiyacınız var. Eğer servis hesabı kullanıyorsanız:
# Servis hesabına Certificate Manager editör rolü verme
gcloud projects add-iam-policy-binding PROJECT_ID
--member="serviceAccount:my-service-account@PROJECT_ID.iam.gserviceaccount.com"
--role="roles/certificatemanager.editor"
İlk Sertifikanızı Oluşturmak
Certificate Manager’da iki tür sertifika var: Google-managed ve self-managed. Google-managed sertifikalar için iki doğrulama yöntemi mevcut: DNS authorization ve load balancer authorization. Bunları teker teker inceleyelim.
DNS Tabanlı Doğrulama
DNS authorization, özellikle wildcard sertifikalar ve Cloud DNS kullanıyorsanız en verimli yöntem. Google, DNS bölgenize bir CNAME kaydı eklemenizi istiyor ve bu kayıt üzerinden domaini doğruluyor.
Önce DNS authorization objesi oluşturuyoruz:
# DNS authorization oluşturma
gcloud certificate-manager dns-authorizations create my-dns-auth
--domain="example.com"
--location=global
# Oluşturulan authorization'ın detaylarını görme
gcloud certificate-manager dns-authorizations describe my-dns-auth
--location=global
Bu komutun çıktısında dnsResourceRecord bölümünü göreceksiniz. Buradaki name, type ve data değerlerini DNS sağlayıcınıza eklemeniz gerekiyor. Cloud DNS kullanıyorsanız:
# Cloud DNS'e CNAME kaydı ekleme
gcloud dns record-sets create _acme-challenge.example.com.
--zone=my-zone
--type=CNAME
--ttl=300
--rrdatas="AUTHORIZATION_CNAME_VALUE.acm.0.asia.cloud.goog."
CNAME değerini gcloud certificate-manager dns-authorizations describe çıktısından alacaksınız. DNS yayılımı için biraz beklemeniz gerekebilir.
Şimdi sertifikayı oluşturalım:
# Google-managed sertifika oluşturma (DNS authorization ile)
gcloud certificate-manager certificates create my-certificate
--domains="example.com,www.example.com"
--dns-authorizations="my-dns-auth"
--location=global
Wildcard sertifika için ayrı bir authorization gerekiyor:
# Wildcard için authorization
gcloud certificate-manager dns-authorizations create my-wildcard-auth
--domain="*.example.com"
--location=global
# Wildcard sertifika
gcloud certificate-manager certificates create my-wildcard-cert
--domains="*.example.com"
--dns-authorizations="my-wildcard-auth"
--location=global
Sertifika Durumunu İzlemek
Sertifika oluşturma işlemi anlık değil, biraz zaman alıyor. Durumu takip edin:
# Sertifika durumu kontrolü
gcloud certificate-manager certificates describe my-certificate
--location=global
# Tüm sertifikaları listeleme
gcloud certificate-manager certificates list --location=global
PROVISIONING durumundan ACTIVE durumuna geçmesi genellikle 5-15 dakika sürüyor. Eğer FAILED görüyorsanız, DNS kaydının doğru eklenip eklenmediğini kontrol edin.
Self-Managed Sertifikalar
Kurumsal ortamlarda kendi CA’nızdan aldığınız sertifikaları ya da üçüncü taraf bir CA’dan satın aldıklarınızı da Certificate Manager’a yükleyebilirsiniz. Bu özellikle compliance gereksinimleri olan şirketler için önemli.
# Self-managed sertifika yükleme
gcloud certificate-manager certificates create my-self-managed-cert
--certificate-file="path/to/certificate.pem"
--private-key-file="path/to/private-key.pem"
--location=global
PEM formatında sertifika dosyanız yoksa, genellikle .crt ve .key dosyalarınızı dönüştürmeniz gerekir:
# CRT formatından PEM'e dönüştürme
openssl x509 -in certificate.crt -out certificate.pem -outform PEM
# Sertifika bilgilerini doğrulama
openssl x509 -in certificate.pem -text -noout | grep -E "Subject:|Not After"
Self-managed sertifikaların otomatik yenilenmediğini unutmayın. Süresi dolmadan önce kendiniz güncellemek zorundasınız.
Certificate Map ile Gelişmiş Yönetim
Birden fazla domain ve sertifikanız olduğunda Certificate Map kavramı devreye giriyor. Certificate Map, hangi domainin hangi sertifikayı kullanacağını tanımlayan bir eşleştirme tablosu gibi düşünebilirsiniz.
# Certificate Map oluşturma
gcloud certificate-manager maps create my-cert-map
--location=global
# Map entry ekleme - spesifik domain için
gcloud certificate-manager maps entries create my-entry-1
--map=my-cert-map
--certificates=my-certificate
--hostname=example.com
--location=global
# Map entry ekleme - wildcard için
gcloud certificate-manager maps entries create my-wildcard-entry
--map=my-cert-map
--certificates=my-wildcard-cert
--hostname="*.example.com"
--location=global
# Aynı map'e farklı domain eklemek (multi-tenant senaryo)
gcloud certificate-manager maps entries create my-entry-2
--map=my-cert-map
--certificates=another-certificate
--hostname=anotherdomain.com
--location=global
Certificate Map’i load balancer’a bağlamak için önce describe ile map’in kendiliğinden oluşturulan kaynak adını alın:
# Map detaylarını görme
gcloud certificate-manager maps describe my-cert-map --location=global
Load Balancer ile Entegrasyon
Certificate Manager’ın asıl gücü, load balancer’larla olan entegrasyonunda ortaya çıkıyor. HTTPS Load Balancer oluştururken ya da mevcut birine sertifika eklerken Certificate Map kullanabilirsiniz.
Terraform ile yönetiyorsanız (ki production ortamlarda öyle yapmanız gerekir):
# Önce mevcut load balancer target proxy'sini listeleyelim
gcloud compute target-https-proxies list
# Certificate Map'i mevcut bir HTTPS proxy'e bağlama
gcloud compute target-https-proxies update my-https-proxy
--certificate-map=my-cert-map
--global
Dikkat: Bir target proxy’e Certificate Map atadığınızda, daha önce atanmış olan SSL sertifikaları kaldırılıyor. Bu işlemi yapmadan önce sertifika map’inizin doğru yapılandırıldığından emin olun.
Gerçek Dünya Senaryosu: Multi-Domain SaaS Uygulaması
Bir SaaS şirketi hayal edin: Her müşteri için özel subdomain var, örneğin customer1.app.com, customer2.app.com ve müşterilerin kendi custom domainleri: dashboard.customer1.com, dashboard.customer2.com. Bu senaryo Certificate Manager’ın neden var olduğunu anlatan en iyi örnek.
Önce Terraform ile bu yapıyı scriptleyelim. Ancak önce gcloud ile adımları görelim:
#!/bin/bash
# multi-tenant-ssl-setup.sh
PROJECT_ID="my-project"
ZONE_NAME="my-dns-zone"
# Ana wildcard sertifika için authorization
gcloud certificate-manager dns-authorizations create app-wildcard-auth
--domain="*.app.com"
--project=$PROJECT_ID
--location=global
echo "DNS authorization oluşturuldu. CNAME kaydını ekleyin:"
gcloud certificate-manager dns-authorizations describe app-wildcard-auth
--location=global
--format="value(dnsResourceRecord.name, dnsResourceRecord.type, dnsResourceRecord.data)"
# CNAME kaydını otomatik Cloud DNS'e ekle
CNAME_NAME=$(gcloud certificate-manager dns-authorizations describe app-wildcard-auth
--location=global --format="value(dnsResourceRecord.name)")
CNAME_DATA=$(gcloud certificate-manager dns-authorizations describe app-wildcard-auth
--location=global --format="value(dnsResourceRecord.data)")
gcloud dns record-sets create $CNAME_NAME
--zone=$ZONE_NAME
--type=CNAME
--ttl=300
--rrdatas=$CNAME_DATA
--project=$PROJECT_ID
echo "DNS kaydı eklendi. Sertifika oluşturuluyor..."
# Wildcard sertifika oluştur
gcloud certificate-manager certificates create app-wildcard-cert
--domains="*.app.com"
--dns-authorizations="app-wildcard-auth"
--project=$PROJECT_ID
--location=global
echo "Wildcard sertifika oluşturuldu."
Bu script’i birden fazla domain için genişletebilir, müşteri ekleme/çıkarma işlemlerini otomatize edebilirsiniz.
Sertifika Yenileme ve İzleme
Sertifikaları yarattıktan sonra unutmak cazip geliyor. Ama “Google halleder” diye tamamen el çekmek de doğru değil. İzleme sistemi kurmanız şart.
Cloud Monitoring ile sertifika süre dolumunu takip edin:
# Sertifika detaylarını ve süresini görme
gcloud certificate-manager certificates describe my-certificate
--location=global
--format="yaml(name,managed.domains,managed.state,expireTime)"
Self-managed sertifikalar için bir uyarı scripti yazalım:
#!/bin/bash
# cert-expiry-check.sh
# Cron ile günlük çalıştırın: 0 8 * * * /path/to/cert-expiry-check.sh
ALERT_DAYS=30
PROJECT_ID="my-project"
# Tüm sertifikaları al
CERTS=$(gcloud certificate-manager certificates list
--project=$PROJECT_ID
--location=global
--format="value(name)")
for CERT in $CERTS; do
EXPIRE_TIME=$(gcloud certificate-manager certificates describe $CERT
--project=$PROJECT_ID
--location=global
--format="value(expireTime)" 2>/dev/null)
if [ -z "$EXPIRE_TIME" ]; then
continue
fi
# Epoch time'a çevir
EXPIRE_EPOCH=$(date -d "$EXPIRE_TIME" +%s 2>/dev/null ||
date -j -f "%Y-%m-%dT%H:%M:%SZ" "$EXPIRE_TIME" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRE_EPOCH - $NOW_EPOCH) / 86400 ))
if [ $DAYS_LEFT -lt $ALERT_DAYS ]; then
echo "UYARI: $CERT sertifikasının süresi $DAYS_LEFT gün içinde doluyor!"
# Buraya Slack webhook veya email bildirimi ekleyebilirsiniz
fi
done
Yaygın Hatalar ve Çözümleri
FAILED_NOT_VISIBLE hatası: DNS kaydı doğru girilmemiş ya da yayılımı henüz tamamlanmamış. dig _acme-challenge.example.com CNAME komutuyla kaydın görünür olduğunu doğrulayın.
PROVISIONING durumunda takılı kalma: Genellikle DNS propagation süresiyle ilgili. 30 dakika bekleyin, hala aynıysa authorization’ı silin ve yeniden oluşturun.
Load balancer’da sertifika görünmüyor: Certificate Map entry’sinin hostname’ini kontrol edin. Load balancer’a gelen istekteki Host header’ı ile map entry hostname’i tam eşleşmeli.
Self-managed sertifika yüklenemiyor: Private key ile sertifikanın eşleşip eşleşmediğini kontrol edin:
# Sertifika ve private key eşleşme kontrolü
CERT_MODULUS=$(openssl x509 -noout -modulus -in certificate.pem | md5sum)
KEY_MODULUS=$(openssl rsa -noout -modulus -in private-key.pem | md5sum)
if [ "$CERT_MODULUS" == "$KEY_MODULUS" ]; then
echo "Sertifika ve private key eşleşiyor."
else
echo "HATA: Sertifika ve private key eşleşmiyor!"
fi
Regional vs Global Sertifikalar
Certificate Manager’da sertifikaların kapsamı var: global ve regional. Çoğu kullanım durumu için global yeterli. Ancak şu durumlar için regional kullanmanız gerekebilir:
- Regional load balancer kullanıyorsanız
- Veri residency gereksinimleri olan compliance senaryolarında
- Specific region’larda düşük gecikme istiyorsanız
Regional sertifika oluştururken sadece --location parametresini değiştirmeniz yeterli:
# Regional sertifika (örneğin us-central1 için)
gcloud certificate-manager certificates create my-regional-cert
--domains="regional.example.com"
--dns-authorizations="my-dns-auth"
--location=us-central1
Load balancer tipinizle sertifika kapsamınızın eşleşmesi gerekiyor. Global sertifika ile regional load balancer kullanmaya çalışırsanız hata alırsınız.
Terraform ile Yönetim
Production ortamda her şeyi gcloud CLI ile yapmak sürdürülebilir değil. Infrastructure as Code yaklaşımıyla Certificate Manager kaynaklarınızı Terraform ile yönetin:
# Mevcut Certificate Manager kaynaklarını Terraform state'ine import etme
terraform import google_certificate_manager_certificate.my_cert
projects/PROJECT_ID/locations/global/certificates/my-certificate
# Terraform plan çalıştırma
terraform plan -var="project_id=my-project"
# Import sonrası drift kontrolü
terraform refresh
Terraform’da resource değişikliklerinde sertifika map entry’lerini güncellediğinizde kısa bir kesinti yaşanabilir. Bu yüzden sertifika güncellemelerini her zaman önce yeni sertifika oluşturup, sonra map entry’yi güncelleyip, ardından eski sertifikayı silerek yapın. Blue-green yaklaşımı sertifika yönetiminde de geçerli.
Sonuç
GCP Certificate Manager, özellikle büyüyen ve karmaşık hale gelen altyapılarda SSL yönetimini gerçekten kolaylaştırıyor. Gece 2’deki “sertifika süresi doldu” telefon görüşmelerinin önüne geçmek istiyorsanız, bu servise geçiş yapmak mantıklı bir karar.
Özetlemek gerekirse:
- Küçük projeler için Google-managed sertifikalar yeterli, DNS authorization kurun, gerisini Google halleder
- Multi-domain yapılar için Certificate Map kullanın, karmaşıklık yönetilebilir hale geliyor
- Enterprise ortamlar için self-managed sertifikaları da kabul etmesi compliance açısından büyük avantaj
- Her koşulda izleme kurun, özellikle self-managed sertifikalar için expiry alertleri şart
- Terraform kullanın, elle yapılan değişiklikler er geç sorun çıkarıyor
Servisi ilk defa kurarken DNS propagation süresi sizi yanıltabilir, sabırlı olun. CNAME kayıtlarını doğru eklediğinizden emin olduktan sonra 15-20 dakika beklemek çoğu zaman sorunu çözüyor. Altyapınız büyüdükçe bu yatırımın karşılığını fazlasıyla aldığınızı göreceksiniz.
