Zimbra SSL Sertifikası Kurulumu ve Yenileme Rehberi

SSL sertifikası işleri, sysadmin hayatının en “sessiz sedasız patlayan” konularından biridir. Her şey yolunda gidiyorken bir sabah işe geliyorsunuz, kullanıcılar mail alamıyor, Outlook bağlanmıyor, webmail açılmıyor. Bakıyorsunuz: sertifika dün gece sona ermiş. Zimbra üzerinde bu durumu birkaç kez yaşadıktan sonra insan sertifika yönetimine ciddi anlam yüklemeye başlıyor.

Bu yazıda Zimbra üzerinde SSL sertifikası kurulumunu ve yenileme sürecini baştan sona ele alacağız. Hem ticari sertifikalar (Sectigo, DigiCert, GlobalSign gibi) hem de Let’s Encrypt üzerinden ücretsiz sertifika kullanımını işleyeceğiz. Zimbra 8.x ve 9.x sürümlerinde test edilmiş adımlar bunlar.

Ortamı Anlamak: Zimbra ve SSL

Zimbra’nın SSL yönetimi biraz farklı çalışır. Nginx proxy, MTA (Postfix), LDAP ve diğer bileşenlerin her birinin sertifika ihtiyacı var. Zimbra bu sertifikaları /opt/zimbra/ssl/zimbra/ dizini altında merkezî olarak yönetir ve /opt/zimbra/bin/zmcertmgr aracıyla dağıtır.

Şunu bilmek önemli: Zimbra iki farklı sertifika modu destekliyor.

  • commercial: Dışarıdan aldığınız ticari veya ücretsiz (Let’s Encrypt) sertifikalar
  • self: Zimbra’nın kendi oluşturduğu self-signed sertifikalar

Üretim ortamında kesinlikle commercial modunu kullanın. Self-signed sertifikalar mail istemcilerinde sürekli uyarı üretir ve modern mail sunucularıyla TLS握手 sorunları çıkarabilir.

Gerekli Dizin Yapısı ve Hazırlık

Başlamadan önce bazı kontrolleri yapalım. Önce mevcut sertifika durumuna bakalım:

sudo -u zimbra /opt/zimbra/bin/zmcertmgr viewdeployedcrt all

Bu komut tüm Zimbra servislerinde aktif olan sertifikaların bilgisini döker. Geçerlilik tarihi, CN ve issuer bilgisi burada görünür.

Zimbra kullanıcısına geçmeden çalışıyorsanız dikkatli olun. Sertifika işlemlerinin büyük çoğunluğu zimbra kullanıcısı altında yapılmalı:

su - zimbra

Şimdi çalışma dizini oluşturalım:

mkdir -p /opt/zimbra/ssl/certs
chmod 700 /opt/zimbra/ssl/certs
cd /opt/zimbra/ssl/certs

CSR (Certificate Signing Request) Oluşturma

Ticari sertifika alacaksanız önce bir CSR oluşturmanız gerekiyor. Zimbra’nın kendi CSR aracını kullanmak işleri kolaylaştırıyor çünkü private key doğru lokasyona yazılıyor:

/opt/zimbra/bin/zmcertmgr createcsr comm -new 
  -keysize 2048 
  -subject "/C=TR/ST=Istanbul/L=Istanbul/O=Sirket Adi/OU=IT/CN=mail.sirket.com"

Wildcard sertifika kullanacaksanız CN kısmını *.sirket.com yapın. SAN (Subject Alternative Name) eklemek istiyorsanız:

/opt/zimbra/bin/zmcertmgr createcsr comm -new 
  -keysize 2048 
  -subject "/C=TR/ST=Istanbul/L=Istanbul/O=Sirket Adi/OU=IT/CN=mail.sirket.com" 
  -subjectAltNames "mail.sirket.com,webmail.sirket.com,smtp.sirket.com"

CSR dosyası /opt/zimbra/ssl/zimbra/commercial/commercial.csr konumuna yazılır. Bu dosyanın içeriğini sertifika sağlayıcınıza gönderin:

cat /opt/zimbra/ssl/zimbra/commercial/commercial.csr

Ticari Sertifika Kurulumu

Sertifika sağlayıcınızdan genellikle şu dosyaları alırsınız:

  • Alan adınıza özel sertifika dosyası (örn. mail_sirket_com.crt)
  • Intermediate/chain sertifikası (örn. intermediate.crt ya da birden fazla .crt dosyası)
  • Bazen root CA dosyası ayrı gönderilir

Bu dosyaları Zimbra sunucusuna kopyalayın. Ben genellikle /opt/zimbra/ssl/certs/ dizinine koyuyorum.

Önce chain dosyasını düzgün hazırlamanız gerekiyor. Zimbra’nın beklediği format: intermediate + root sertifikalarının birleşimi:

cat intermediate.crt root.crt > /opt/zimbra/ssl/certs/chain.crt

Eğer sertifika sağlayıcınız tek bir chain dosyası verdiyse doğrudan kullanabilirsiniz. Ama her zaman kontrol edin:

openssl verify -CAfile /opt/zimbra/ssl/certs/chain.crt /opt/zimbra/ssl/certs/mail_sirket_com.crt

Çıktı OK demiyorsa chain sırasında sorun var demektir.

Şimdi Zimbra’nın doğrulama aracıyla sertifikanın uyumunu test edelim:

/opt/zimbra/bin/zmcertmgr verifycrt comm 
  /opt/zimbra/ssl/zimbra/commercial/commercial.key 
  /opt/zimbra/ssl/certs/mail_sirket_com.crt 
  /opt/zimbra/ssl/certs/chain.crt

Bu adım kritik. “VALID” çıktısı görürseniz devam edebilirsiniz. Hata alırsanız genellikle şu üç nedenden biri:

  • Private key ile sertifika eşleşmiyor (yanlış CSR ile sertifika alınmış)
  • Chain dosyası eksik ya da yanlış sıralı
  • Sertifika henüz aktif değil (sertifikalar genellikle birkaç saat içinde geçerli oluyor)

Doğrulama geçtikten sonra sertifikayı deploy edelim:

/opt/zimbra/bin/zmcertmgr deploycrt comm 
  /opt/zimbra/ssl/certs/mail_sirket_com.crt 
  /opt/zimbra/ssl/certs/chain.crt

Deployment sonrası Zimbra servislerini yeniden başlatın:

zmcontrol restart

Bu işlem 2-3 dakika sürebilir. Sonrasında tekrar doğrulayın:

/opt/zimbra/bin/zmcertmgr viewdeployedcrt all

Let’s Encrypt ile Ücretsiz SSL Sertifikası

Let’s Encrypt konusu biraz daha hassas çünkü Zimbra’nın standart web sunucusu (nginx proxy) 443 portunu kullandığından certbot’un webroot ya da standalone doğrulaması zorlaşabiliyor. Ben pratikte DNS-01 challenge’ı tercih ediyorum. Ama önce standart yöntemi görelim.

HTTP-01 Doğrulama Yöntemi

Bu yöntem için Zimbra nginx’ini geçici olarak durdurmanız ya da port yönlendirmesi yapmanız gerekiyor. Pratik değil, ürün ortamında risk oluşturuyor.

DNS-01 Doğrulama Yöntemi (Önerilen)

DNS sağlayıcınızın API’si varsa (Cloudflare, AWS Route53 gibi) bu yöntem en temizi. Cloudflare örneği:

apt-get install certbot python3-certbot-dns-cloudflare

# Cloudflare API token dosyası
cat > /etc/letsencrypt/cloudflare.ini << EOF
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
EOF

chmod 600 /etc/letsencrypt/cloudflare.ini

certbot certonly 
  --dns-cloudflare 
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini 
  -d mail.sirket.com 
  -d webmail.sirket.com 
  --preferred-challenges dns-01

Sertifikalar /etc/letsencrypt/live/mail.sirket.com/ altına yazılır. Şimdi bunları Zimbra formatına uyarlayalım:

# root olarak çalışın, sonra zimbra kullanıcısına geçin
cp /etc/letsencrypt/live/mail.sirket.com/privkey.pem 
   /opt/zimbra/ssl/zimbra/commercial/commercial.key

cp /etc/letsencrypt/live/mail.sirket.com/cert.pem 
   /opt/zimbra/ssl/certs/letsencrypt.crt

cp /etc/letsencrypt/live/mail.sirket.com/chain.pem 
   /opt/zimbra/ssl/certs/letsencrypt-chain.crt

chown zimbra:zimbra /opt/zimbra/ssl/zimbra/commercial/commercial.key
chmod 640 /opt/zimbra/ssl/zimbra/commercial/commercial.key

Doğrulama ve deployment:

su - zimbra -c "/opt/zimbra/bin/zmcertmgr verifycrt comm 
  /opt/zimbra/ssl/zimbra/commercial/commercial.key 
  /opt/zimbra/ssl/certs/letsencrypt.crt 
  /opt/zimbra/ssl/certs/letsencrypt-chain.crt"

su - zimbra -c "/opt/zimbra/bin/zmcertmgr deploycrt comm 
  /opt/zimbra/ssl/certs/letsencrypt.crt 
  /opt/zimbra/ssl/certs/letsencrypt-chain.crt"

su - zimbra -c "zmcontrol restart"

Otomatik Yenileme Scripti

Let’s Encrypt sertifikaları 90 günde bir yenilenmesi gerekiyor. Bunu otomatize etmek şart. Aşağıdaki scripti kullanıyorum, oldukça güvenilir:

#!/bin/bash
# /usr/local/bin/zimbra-ssl-renew.sh

LOG="/var/log/zimbra-ssl-renew.log"
ZIMBRA_USER="zimbra"
ZIMBRA_BIN="/opt/zimbra/bin"
CERT_DIR="/opt/zimbra/ssl/certs"
LE_DIR="/etc/letsencrypt/live/mail.sirket.com"
DOMAIN="mail.sirket.com"

echo "=== SSL Yenileme Basliyor: $(date) ===" >> $LOG

# Certbot ile yenile
certbot renew --dns-cloudflare 
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini 
  --quiet >> $LOG 2>&1

if [ $? -ne 0 ]; then
  echo "HATA: certbot yenileme basarisiz" >> $LOG
  exit 1
fi

# Dosyalari kopyala
cp $LE_DIR/privkey.pem /opt/zimbra/ssl/zimbra/commercial/commercial.key
cp $LE_DIR/cert.pem $CERT_DIR/letsencrypt.crt
cp $LE_DIR/chain.pem $CERT_DIR/letsencrypt-chain.crt

chown $ZIMBRA_USER:$ZIMBRA_USER /opt/zimbra/ssl/zimbra/commercial/commercial.key
chmod 640 /opt/zimbra/ssl/zimbra/commercial/commercial.key

# Dogrula ve deploy et
su - $ZIMBRA_USER -c "$ZIMBRA_BIN/zmcertmgr verifycrt comm 
  /opt/zimbra/ssl/zimbra/commercial/commercial.key 
  $CERT_DIR/letsencrypt.crt 
  $CERT_DIR/letsencrypt-chain.crt" >> $LOG 2>&1

if [ $? -ne 0 ]; then
  echo "HATA: Sertifika dogrulamasi basarisiz" >> $LOG
  exit 1
fi

su - $ZIMBRA_USER -c "$ZIMBRA_BIN/zmcertmgr deploycrt comm 
  $CERT_DIR/letsencrypt.crt 
  $CERT_DIR/letsencrypt-chain.crt" >> $LOG 2>&1

su - $ZIMBRA_USER -c "zmcontrol restart" >> $LOG 2>&1

echo "=== Yenileme Tamamlandi: $(date) ===" >> $LOG

Script’e çalışma izni verin ve cron’a ekleyin:

chmod +x /usr/local/bin/zimbra-ssl-renew.sh

# Her ayın 1'i ve 15'inde gece 2'de çalıştır
echo "0 2 1,15 * * root /usr/local/bin/zimbra-ssl-renew.sh" >> /etc/cron.d/zimbra-ssl

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

Servis Başlamıyor, Sertifika Hatası Var

Deployment sonrası zmcontrol restart yaparken hata alırsanız önce Zimbra nginx loguna bakın:

tail -100 /opt/zimbra/log/nginx.log | grep -i "error|ssl|cert"

Zimbra proxy’nin sertifikayı düzgün okuyup okuyamadığını şöyle test edebilirsiniz:

openssl s_client -connect mail.sirket.com:443 -showcerts 2>/dev/null | 
  openssl x509 -noout -dates -subject

Chain Sırası Sorunu

Bazen sertifika sağlayıcıları chain dosyasını ters sırada gönderiyor. Doğru sıra şöyle olmalı:

  • Önce alan adı sertifikası
  • Sonra intermediate CA
  • En son root CA

Bunu kontrol etmek için:

openssl verify -verbose -CAfile /opt/zimbra/ssl/certs/chain.crt 
  /opt/zimbra/ssl/certs/mail_sirket_com.crt

LDAP Sertifika Sorunu

Bazen LDAP servisi sertifika güncellemesini tam almaz. Şu komut LDAP’a da sertifikayı dağıtır:

su - zimbra -c "/opt/zimbra/bin/zmcertmgr deploycrt comm 
  /opt/zimbra/ssl/certs/letsencrypt.crt 
  /opt/zimbra/ssl/certs/letsencrypt-chain.crt && 
  /opt/zimbra/bin/zmlocalconfig -e ldap_master_url=ldaps://mail.sirket.com:636"

Sertifika Sona Erme Uyarısı

Sertifika geçerlilik süresini düzenli izlemek için basit bir monitoring scripti:

#!/bin/bash
# Sertifika bitmesine 30 günden az kaldıysa uyar

DOMAIN="mail.sirket.com"
PORT="443"
WARN_DAYS=30

EXPIRY=$(echo | openssl s_client -servername $DOMAIN 
  -connect $DOMAIN:$PORT 2>/dev/null | 
  openssl x509 -noout -enddate | cut -d= -f2)

EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_EPOCH - $NOW_EPOCH) / 86400 ))

if [ $DAYS_LEFT -lt $WARN_DAYS ]; then
  echo "UYARI: $DOMAIN sertifikasi $DAYS_LEFT gun sonra sona eriyor!"
  # Buraya mail bildirimi veya Slack webhook ekleyebilirsiniz
fi

echo "Sertifika gecerlilik suresi: $DAYS_LEFT gun"

Admin Panelinden SSL Yönetimi

Komut satırı yerine Zimbra Admin konsolunu tercih edenler için kısa bir not: Admin Konsolu > Yapılandırma > Sertifikalar yolunu izleyerek de sertifika yükleyebilirsiniz. Ancak pratikte büyük ölçekli ortamlarda ve otomasyonda CLI çok daha esnek. Admin konsolunu genellikle sertifika durumunu hızlıca görsel olarak kontrol etmek için kullanıyorum, kurulum için değil.

Multi-Server Zimbra Ortamında SSL

Birden fazla Zimbra sunucunuz varsa (MTA + Mailbox + Proxy ayrı sunucularda) her sunucu için ayrı deployment yapmanız gerekiyor. Sertifika dosyaları merkezi bir yerden dağıtılsa da zmcertmgr deploycrt her sunucuda ayrı çalıştırılmalı.

Genellikle şöyle bir loop yazıyorum:

for server in mta1.sirket.com mta2.sirket.com proxy.sirket.com; do
  ssh root@$server "su - zimbra -c '/opt/zimbra/bin/zmcertmgr deploycrt comm 
    /opt/zimbra/ssl/certs/sirket.crt 
    /opt/zimbra/ssl/certs/chain.crt && zmcontrol restart'"
done

Tabii bu yaklaşım SSH key authentication gerektiriyor. Yapılandırmadıysanız önce bunu hallledin.

Zimbra’nın Dahili CA Sertifikasını Güncelleme

Zimbra sunucu bileşenleri arasındaki iletişim (LMTP, LDAP vs.) için kendi dahili CA sertifikasını kullanır. Bu sertifika varsayılan olarak 5 yıllıktır ve çoğu kurulumda atlanan bir yenileme adımıdır. Dahili CA sertifikasını kontrol edin:

su - zimbra -c "/opt/zimbra/bin/zmcertmgr viewdeployedcrt mta"

Eğer süresi yaklaşıyorsa:

su - zimbra -c "/opt/zimbra/bin/zmcertmgr createca -new"
su - zimbra -c "/opt/zimbra/bin/zmcertmgr deployca"

Bu adımı atlamak, dış sertifikanız mükemmel olsa bile servisler arası iletişimde sorun yaratabilir. Özellikle Zimbra 8.x’ten 9.x’e geçişlerde bu sık karşılaşılan bir sorun.

Sonuç

Zimbra’da SSL yönetimi ilk bakışta karmaşık görünüyor çünkü birden fazla katman var: dış istemcilerle iletişim, servisler arası iletişim, LDAP, MTA… Ama süreci bir kez düzgün oturtursanız sonraki yenilemeler neredeyse tamamen otomatik çalışıyor.

Özetlemek gerekirse kritik noktalar şunlar:

  • CSR oluştururken her zaman Zimbra’nın kendi zmcertmgr createcsr aracını kullanın, private key lokasyon sorunlarından kurtulursunuz
  • Deploy öncesi mutlaka zmcertmgr verifycrt ile doğrulama yapın, prodüksiyon ortamında sürpriz istemezsiniz
  • Let’s Encrypt kullanıyorsanız DNS-01 challenge tercih edin, Zimbra nginx’i durdurmak zorunda kalmazsınız
  • Otomatik yenileme scriptini kurun ve en az ayda bir log’u kontrol edin
  • Dahili CA sertifikasını unutmayın, 5 yıl uzun görünür ama süresi dolduğunda tüm servisler çöker
  • Multi-server ortamlarda her node’a ayrı deployment yapmanız gerektiğini aklınızdan çıkarmayın

Sertifika sona erme alarmını bir monitoring sistemine (Nagios, Zabbix, Prometheus) entegre ederseniz ve otomatik yenileme scriptiniz düzgün çalışırsa bu konuyu bir daha düşünmek zorunda kalmazsınız. İyi sistemler sessizce çalışır.

Bir yanıt yazın

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