SSL/TLS Handshake Nedir?
SSL/TLS Handshake (el sıkışma), tarayıcı ile sunucu arasında güvenli bağlantı kurulmadan önce gerçekleşen bir dizi adımdır. Bu süreçte kimlik doğrulama, protokol ve şifreleme yöntemi belirlenir. Handshake başarısız olursa güvenli bağlantı kurulamaz.
TLS Handshake Süreci (4 Adım)
- Client Hello: Tarayıcı desteklediği TLS sürümlerini ve cipher suite'leri gönderir
- Server Hello: Sunucu bir TLS sürümü ve cipher suite seçer, sertifikasını gönderir
- Doğrulama: Tarayıcı sertifikayı doğrular ve pre-master secret oluşturur
- Tamamlama: Her iki taraf session key'i oluşturur ve şifreli iletişim başlar
Herhangi bir adımda sorun yaşanırsa "Handshake Failed" hatası oluşur.
Neden 1: Protokol Uyumsuzluğu
Tarayıcı ve sunucu ortak bir TLS sürümünde anlaşamaz. Genellikle sunucu yalnızca TLS 1.0/1.1 destekliyorken modern tarayıcı bunları kabul etmez.
Çözüm
# Sunucunun desteklediği protokolleri kontrol edin
openssl s_client -connect domain.com:443 -tls1_2
openssl s_client -connect domain.com:443 -tls1_3
# Nginx: TLS 1.2 ve 1.3 aktif
ssl_protocols TLSv1.2 TLSv1.3;
# Apache: TLS 1.2 ve 1.3 aktif
SSLProtocol -all +TLSv1.2 +TLSv1.3
Neden 2: Sertifika Zinciri Bozuk
Ara sertifika eksik veya sıralama yanlış ise handshake sırasında doğrulama başarısız olur.
Çözüm
# Sertifika zincirini kontrol edin
openssl s_client -connect domain.com:443 -showcerts
# Fullchain dosyası oluşturun (doğru sıralama)
cat site.crt intermediate.crt > fullchain.pem
# Nginx
ssl_certificate /etc/ssl/fullchain.pem;
Neden 3: Süresi Dolmuş Sertifika
Sertifikanın geçerlilik süresi dolmuşsa handshake başarısız olabilir.
# Bitiş tarihini kontrol edin
openssl s_client -connect domain.com:443 | openssl x509 -noout -dates
# Çıktı:
# notBefore=Jan 15 00:00:00 2025 GMT
# notAfter=Apr 15 23:59:59 2026 GMT
Neden 4: Sertifika ve Key Eşleşmemesi
SSL sertifikası ile private key dosyası eşleşmiyorsa handshake sırasında sunucu imzayı doğrulayamaz.
# Eşleşme kontrolü
openssl x509 -noout -modulus -in cert.pem | openssl md5
openssl rsa -noout -modulus -in key.pem | openssl md5
# Her iki MD5 değeri aynı olmalıdır
Neden 5: Firewall veya IDS/IPS Müdahalesi
Güvenlik duvarı veya saldırı tespit sistemi SSL trafiğini engelleyebilir veya bozabilir.
Çözüm
- Port 443'ün açık olduğunu doğrulayın:
telnet domain.com 443 - Firewall loglarını SSL ile ilgili engellemeler için inceleyin
- IDS/IPS kurallarındaki SSL inspection ayarlarını kontrol edin
Neden 6: Server Overload
Sunucu aşırı yük altındayken handshake için yeterli kaynak ayıramayabilir. Özellikle RSA key exchange yoğun CPU kullanır.
Çözüm
- ECDHE key exchange kullanın (RSA'dan daha hızlı)
- SSL session caching aktif edin
- TLS 1.3 kullanın (daha hızlı handshake — 1-RTT)
# Nginx: Session caching
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets on;
Hata Ayıklama Araçları
| Araç | Kullanım |
|---|---|
openssl s_client | Detaylı handshake bilgisi ve hata mesajları |
| Wireshark | TLS handshake paketlerini analiz etme |
| SSL Labs | Web tabanlı kapsamlı SSL testi |
curl -vvv | Verbose modda detaylı bağlantı bilgisi |
| DATASSL SSL Checker | Hızlı sertifika zinciri kontrolü |
Sonuç
SSL/TLS Handshake Failed hatası birden fazla nedenden kaynaklanabilir. Sistematik bir yaklaşımla — önce sertifika geçerliliğini, sonra zinciri, ardından protokol ve cipher uyumluluğunu kontrol ederek — sorunu hızlıca teşhis edebilirsiniz. TLS 1.3 ve ECDHE kullanımı hem güvenliği artırır hem de handshake süresini kısaltır.