OpenSSL ile Sertifika ve Bağlantı Testi

Bir sertifika sorunu yüzünden gece yarısı uyandırılmak, sistem yöneticilerinin en kötü kabuslarından biridir. Tarayıcıda kırmızı kilit simgesi, müşteri şikayetleri, üretim servisleri çökmüş… Ve elinde sadece bir terminal var. İşte bu yüzden openssl komutunu gerçekten iyi bilmek, sysadmin olarak hayatta kalmanın temel becerilerinden biri haline geldi. Bu yazıda openssl ile sertifika ve bağlantı testini tüm pratik detaylarıyla ele alacağız.

OpenSSL Nedir ve Neden Bu Kadar Önemli?

OpenSSL, TLS/SSL protokollerini implemente eden açık kaynaklı bir kriptografi kütüphanesi ve komut satırı aracıdır. Neredeyse her Linux dağıtımında varsayılan olarak kurulu gelir ve şu işler için vazgeçilmezdir:

  • Sertifika bilgilerini okumak ve doğrulamak
  • SSL/TLS bağlantılarını test etmek
  • Sertifika zincirini kontrol etmek
  • Özel anahtar ve CSR oluşturmak
  • Şifreleme algoritmalarını test etmek
  • Son kullanma tarihlerini otomatize kontrol etmek

Sadece web sunucuları için değil, mail sunucuları, veritabanı bağlantıları, API gateway’ler ve iç servisler arası iletişim için de kullanırsınız. Hadi doğrudan işin içine girelim.

Temel Sertifika Bilgilerini Okumak

Dosyadaki Sertifikayı İncelemek

Elinizde bir .crt, .pem veya .cer dosyası varsa ve içini görmek istiyorsanız:

openssl x509 -in sertifika.crt -text -noout

Bu komut size sertifika hakkında her şeyi döker. Ama çıktı çok uzun olabilir. Sadece belirli bilgilere ihtiyacınız varsa:

# Sadece son kullanma tarihini görmek
openssl x509 -in sertifika.crt -noout -enddate

# Sadece başlangıç tarihini görmek
openssl x509 -in sertifika.crt -noout -startdate

# Hem başlangıç hem bitiş tarihini bir arada
openssl x509 -in sertifika.crt -noout -dates

# Sertifikanın hangi domain için verildiğini görmek
openssl x509 -in sertifika.crt -noout -subject

# Sertifikayı veren CA bilgisi
openssl x509 -in sertifika.crt -noout -issuer

# Sertifikanın parmak izi (fingerprint)
openssl x509 -in sertifika.crt -noout -fingerprint -sha256

Gerçek dünya senaryosu: Bir müşteri size “sertifika mı süresi mi doldu, ne zaman doluyor?” diye sorduğunda, terminal açıp 3 saniyede cevap verirsiniz. E-posta zincirinde kaybolmak yerine.

Subject Alternative Names (SAN) Kontrolü

Wildcard sertifikalar ve çok domainli sertifikalar için hangi domainlerin kapsandığını görmek kritik:

openssl x509 -in sertifika.crt -noout -text | grep -A 1 "Subject Alternative Name"

Ya da daha temiz bir çıktı için:

openssl x509 -in sertifika.crt -noout -ext subjectAltName

Canlı Sunucuya Bağlanarak Sertifika Testi

Temel Bağlantı Testi

Bu, muhtemelen en çok kullanacağınız openssl komutu:

openssl s_client -connect example.com:443

Bu komut sunucuya bağlanır, TLS el sıkışmasını yapar ve bağlantıyı açık tutar. CTRL+C ile çıkabilirsiniz ya da Q yazıp enter’a basabilirsiniz. Çıktıda şunları göreceksiniz:

  • Sertifika zinciri (Certificate chain)
  • Sunucu sertifika bilgileri
  • SSL session detayları
  • Kullanılan cipher suite

Sadece Sertifika Bilgisini Almak

Bağlantıyı açık tutmadan sadece sertifika bilgisini çekmek için:

echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -text

Ya da sadece son kullanma tarihini:

echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate

Bu komutu monitöring scriptlerinde çok kullanacaksınız. Bir sertifikanın kaç gün sonra dolacağını hesaplamak için:

# Sertifikanın kaç gün kaldığını hesapla
EXPIRY=$(echo | openssl s_client -connect example.com:443 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 ))
echo "Sertifika $DAYS_LEFT gün sonra doluyor"

SNI (Server Name Indication) ile Test

Aynı IP üzerinde birden fazla domain barındırıyorsanız (virtual hosting), SNI olmadan yanlış sertifika alabilirsiniz:

openssl s_client -connect 192.168.1.100:443 -servername example.com

Bu özellikle CDN arkasındaki sunucuları test ederken kritik. Cloudflare veya AWS ALB kullanıyorsanız IP’ye direk bağlandığınızda SNI şart.

Sertifika Zinciri Doğrulama

Sertifika zincirleri çoğu sorunun kaynağıdır. Tarayıcı kabul ediyor ama API client kabul etmiyor mu? Büyük ihtimalle ara sertifika (intermediate certificate) sorunu.

openssl s_client -connect example.com:443 -showcerts

Bu komut tüm zinciri gösterir. Her BEGIN CERTIFICATE ve END CERTIFICATE bloğu ayrı bir sertifikadır. İlki sunucu sertifikası, sonrakiler intermediate CA’lar.

Zincirin geçerli olup olmadığını doğrulamak için:

# CA bundle ile doğrulama
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt sertifika.crt

# Intermediate ile birlikte doğrulama
openssl verify -CAfile ca-chain.crt sertifika.crt

Çıktıda OK görüyorsanız sorun yok. error 20: unable to get local issuer certificate gibi bir şey görüyorsanız zincirde kopukluk var demektir.

Sertifika Zincirini Kaydetmek

Sunucudan tüm zinciri dosyaya kaydetmek için:

openssl s_client -connect example.com:443 -showcerts 2>/dev/null | 
  awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/' > full-chain.pem

Farklı Protokoller ve Portlar

SSL/TLS sadece HTTPS değil. Mail, veritabanı, LDAP… Hepsini test edebilirsiniz.

# SMTP ile STARTTLS testi
openssl s_client -connect mail.example.com:587 -starttls smtp

# IMAP ile STARTTLS testi
openssl s_client -connect mail.example.com:143 -starttls imap

# POP3 ile STARTTLS testi
openssl s_client -connect mail.example.com:110 -starttls pop3

# LDAPS testi
openssl s_client -connect ldap.example.com:636

# PostgreSQL SSL testi
openssl s_client -connect db.example.com:5432 -starttls postgres

# MySQL/MariaDB SSL testi (MySQL 5.7.11+)
openssl s_client -connect db.example.com:3306 -starttls mysql

Gerçek dünya senaryosu: Mail sunucunuz SSL hatası veriyor ama port 25 üzerinden test ettiğinizde sorun göremiyorsunuz. starttls smtp parametresi ile port 587 veya 465 üzerinden test ettiğinizde asıl sorunu görürsünüz.

TLS Versiyonu ve Cipher Suite Testi

Belirli TLS Versiyonunu Test Etmek

TLS 1.0 ve 1.1 artık eski ve güvensiz kabul ediliyor. Sunucunuzun hangi versiyonları desteklediğini test edin:

# TLS 1.2 ile bağlanmayı dene
openssl s_client -connect example.com:443 -tls1_2

# TLS 1.3 ile bağlanmayı dene
openssl s_client -connect example.com:443 -tls1_3

# TLS 1.1 desteklenip desteklenmediğini test et (desteklenmemeli!)
openssl s_client -connect example.com:443 -tls1_1

# TLS 1.0 desteklenip desteklenmediğini test et (kesinlikle desteklenmemeli!)
openssl s_client -connect example.com:443 -tls1

Bağlantı başarısızsa “handshake failure” hatası alırsınız, bu iyi bir şey. Demek ki o versiyon devre dışı.

Kullanılabilir Cipher Suite’leri Listelemek

# Tüm kullanılabilir cipher'ları listele
openssl ciphers -v 'ALL:eNULL'

# Sadece TLS 1.3 cipher'ları
openssl ciphers -v 'TLSv1.3'

# Güçlü cipher'lar
openssl ciphers -v 'HIGH:!aNULL:!MD5'

Belirli bir cipher ile bağlantı test etmek:

openssl s_client -connect example.com:443 -cipher 'ECDHE-RSA-AES256-GCM-SHA384'

CSR ve Özel Anahtar İşlemleri

Yeni Özel Anahtar ve CSR Oluşturmak

Sertifika yenileme zamanı geldi ve CSR oluşturmanız gerekiyor:

# 4096 bit RSA anahtar oluştur
openssl genrsa -out private.key 4096

# Bu anahtarla CSR oluştur
openssl req -new -key private.key -out request.csr

# Tek komutta hem anahtar hem CSR oluştur
openssl req -new -newkey rsa:4096 -nodes -keyout private.key -out request.csr

CSR içeriğini kontrol etmek için:

openssl req -in request.csr -noout -text

Özel Anahtarın Sertifikayla Eşleşip Eşleşmediğini Doğrulamak

Bu, sertifika yüklemesinde yapılan en yaygın hatalardan birini önler. Yanlış anahtar yanlış sertifika ile eşleştirilirse servis ayağa kalkmaz:

# Her ikisinin modulus değerini al ve karşılaştır
openssl x509 -noout -modulus -in sertifika.crt | md5sum
openssl rsa -noout -modulus -in private.key | md5sum

İki çıktı aynıysa eşleşiyorlar demektir. Farklıysa yanlış anahtar kullanıyorsunuzdur.

CSR ile de kontrol edebilirsiniz:

openssl req -noout -modulus -in request.csr | md5sum

Üçü de aynı olmalı.

Self-Signed Sertifika Oluşturmak

Test ortamları, iç ağ servisleri veya geliştirme ortamları için self-signed sertifika oluşturmak sık başvurulan bir ihtiyaç:

# 10 yıl geçerli self-signed sertifika (3650 gün)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem 
  -days 3650 -nodes 
  -subj "/C=TR/ST=Istanbul/L=Istanbul/O=Sirket/CN=example.com"

SAN (Subject Alternative Name) ile daha modern bir self-signed sertifika:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem 
  -days 365 -nodes 
  -subj "/CN=example.com" 
  -addext "subjectAltName=DNS:example.com,DNS:www.example.com,IP:192.168.1.100"

Modern tarayıcılar ve birçok client artık SAN olmayan sertifikaları reddediyor. Bu yüzden -addext parametresini kullanmayı alışkanlık edinin.

Toplu Sertifika Kontrolü için Script

Birden fazla sunucuyu veya domaini yönetiyorsanız, her birini tek tek kontrol etmek zaman kaybı. İşte basit ama etkili bir monitoring scripti:

#!/bin/bash
# ssl-check.sh - Çoklu domain SSL sertifika kontrolü

DOMAINS=(
    "example.com:443"
    "api.example.com:443"
    "mail.example.com:465"
    "db.example.com:5432"
)

UYARI_ESIGI=30  # Kaç günden az kaldıysa uyar

echo "=== SSL Sertifika Kontrolü - $(date) ==="
echo ""

for HEDEF in "${DOMAINS[@]}"; do
    HOST=$(echo $HEDEF | cut -d: -f1)
    PORT=$(echo $HEDEF | cut -d: -f2)
    
    BITIS=$(echo | timeout 10 openssl s_client -connect $HOST:$PORT 
        -servername $HOST 2>/dev/null | 
        openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
    
    if [ -z "$BITIS" ]; then
        echo "HATA: $HOST:$PORT - Bağlantı kurulamadı veya sertifika alınamadı"
        continue
    fi
    
    BITIS_EPOCH=$(date -d "$BITIS" +%s 2>/dev/null)
    SIMDI_EPOCH=$(date +%s)
    KALAN=$(( ($BITIS_EPOCH - $SIMDI_EPOCH) / 86400 ))
    
    if [ $KALAN -lt 0 ]; then
        echo "KRITIK: $HOST:$PORT - Sertifika SÜRESI DOLMUŞ!"
    elif [ $KALAN -lt $UYARI_ESIGI ]; then
        echo "UYARI: $HOST:$PORT - $KALAN gün kaldı! ($BITIS)"
    else
        echo "OK: $HOST:$PORT - $KALAN gün kaldı ($BITIS)"
    fi
done

Bu scripti crontab’a ekleyip her gün çalıştırabilir, çıktısını mail ile gönderebilirsiniz:

# Crontab'a ekle - Her gün sabah 8'de çalıştır
0 8 * * * /opt/scripts/ssl-check.sh | mail -s "SSL Sertifika Raporu" [email protected]

Hata Ayıklama Senaryoları

“SSL Handshake Failure” Hatasını Çözmek

Bağlantı kurarken handshake hatası alıyorsanız:

# Daha fazla debug bilgisi için
openssl s_client -connect example.com:443 -debug

# Sadece durum bilgisi
openssl s_client -connect example.com:443 -state

OCSP (Online Certificate Status Protocol) Kontrolü

Sertifikanın iptal edilip edilmediğini kontrol etmek için:

# Önce OCSP URL'ini bul
openssl x509 -in sertifika.crt -noout -text | grep "OCSP"

# OCSP sorgusunu yap
openssl ocsp -issuer ara-ca.crt -cert sertifika.crt 
  -url http://ocsp.example-ca.com -resp_text

Proxy Arkasında Test

Kurumsal ortamlarda çoğunlukla proxy var. Proxy üzerinden test için:

openssl s_client -connect example.com:443 -proxy proxy.sirket.com:8080

Bağlantı Zaman Aşımını Ayarlamak

Yavaş sunucularda veya ağ sorunlarında timeout eklemek önemli:

# 5 saniye timeout ile bağlan
timeout 5 openssl s_client -connect example.com:443 < /dev/null

OpenSSL ile Şifreleme Testleri

Sysadmin olarak bazen şifreleme performansını da test etmeniz gerekir:

# AES-256 şifreleme hız testi
openssl speed aes-256-cbc

# RSA anahtar üretim hızı testi
openssl speed rsa2048

# SHA256 hash hızı
openssl speed sha256

# Tüm algoritmaları test et
openssl speed

Bu testler özellikle donanım güvenlik modülü (HSM) veya yeni sunucu kurulumlarında referans değerler almak için kullanışlı.

Pratik İpuçları ve Sık Yapılan Hatalar

Hata 1: -noout parametresini unutmak -text ile sertifika bilgisini görmek istediğinizde -noout eklemezseniz, hem PEM formatındaki ham sertifika hem de text çıktısı gelir. Genellikle sadece metin çıktısı istiyorsunuzdur, -noout şart.

Hata 2: SNI gereken yerlerde IP ile test etmek Sanal hosting ortamlarında IP adresiyle test ettiğinizde farklı (genellikle varsayılan) sertifika gelir. Her zaman -servername parametresini ekleyin.

Hata 3: Sertifika zincirini yüklemeden test etmek openssl verify komutunu çalıştırırken sisteminizde intermediate CA sertifikaları yoksa hata alırsınız. CA bundle’ını güncel tutun: update-ca-certificates (Debian/Ubuntu) veya update-ca-trust (RHEL/CentOS).

Hata 4: Özel anahtarı sertifikayla doğrulamamak Nginx veya Apache’ye yeni sertifika yüklemeden önce mutlaka modulus kontrolü yapın. Yanlış çift yüklediğinizde servis ayağa kalkmaz ve gece 2’de uğraşırsınız.

Pratik kısayol – Her şeyi bir komutta görmek:

openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>/dev/null | 
  openssl x509 -noout -subject -issuer -dates -fingerprint

Bu tek komut: domain sahibini, kim verdiğini, başlangıç/bitiş tarihlerini ve parmak izini gösterir. Support ticket açmadan önce müşteriyle konuşurken bu çıktıyı kullanmak çok pratik.

Sonuç

openssl komutu, bir sysadmin’in araç çantasındaki en keskin bıçaklardan biri. Sertifika sorunlarının büyük çoğunluğu; süresi dolmuş sertifikalar, yanlış anahtar-sertifika eşleşmeleri, eksik intermediate CA’lar ve yanlış yapılandırılmış SNI’dan kaynaklanır. Bu yazıda anlattığım komutlar ve scriptlerle bu sorunların hepsini terminal’den, hızlıca tespit edebilirsiniz.

Özellikle toplu kontrol scriptini production ortamınıza entegre edin. Sertifika son kullanma tarihleri için en az 30 gün öncesinden uyarı almanız, gece yarısı olaylarını ciddi ölçüde azaltacak. Cron job kurulumu 5 dakika alıyor, sizi kurtaracağı zaman ise… paha biçilemez.

Son olarak şunu söyleyeyim: OpenSSL’in çıktısı ilk bakışta korkutucu gelebilir, ama yukarıdaki komutları birkaç kez çalıştırdıktan sonra neye baktığınızı anlamak çok kolaylaşıyor. En iyi öğrenme yöntemi, canlı bir sunucuya karşı bu komutları çalıştırmak. Hemen deneyin.

Yorum yapın