Korkunç javax.net.ssl.SSLHandshakeException: remote host closed connection during handshake
hatası, Java geliştiricileri için önemli bir engel olabilir. Bu istisna, kritik SSL/TLS el sıkışma işlemi sırasında bir başarısızlığı işaret eder ve Java uygulamanızın uzak bir sunucuyla güvenli bir bağlantı kurmasını engeller. Bu kapsamlı kılavuz, temel nedenleri araştırıyor ve bu sinir bozucu sorunu çözmek için pratik çözümler sunuyor.
İçindekiler
- SSLHandshakeException’ı Anlamak
- Çözüm 1: Java Sürümünüzü Güncellemek
- Çözüm 2: SSL/TLS Protokollerini Yapılandırmak
- Çözüm 3: SSL Sertifikalarını Doğrulamak
- Sorun Giderme ve Gelişmiş Teknikler
- Sıkça Sorulan Sorular (SSS)
SSLHandshakeException’ı Anlamak
Güvenli bir bağlantı kurmaktan sorumlu olan SSL/TLS el sıkışması başarısız olduğunda SSLHandshakeException
oluşur. “remote host closed connection during handshake” mesajı özellikle, sunucunun el sıkışma tamamlanmadan önce bağlantıyı erken sonlandırdığını gösterir. Bu, istemcide (Java uygulamanız) veya sunucuda çeşitli sorunlardan kaynaklanabilir.
Yaygın nedenler şunlardır:
- Eski Java Sürümü: Eski Java sürümleri, sunucu tarafından kullanılan modern SSL/TLS protokollerini desteklemeyebilir ve bu da uyumsuzluğa neden olabilir.
- Yanlış SSL/TLS Protokolü Yapılandırması: Java uygulamanız ve sunucu tarafından desteklenen protokoller arasında uyumsuzluk.
- Geçersiz veya Eksik SSL Sertifikaları: Sunucunun SSL sertifikasında sorunlar (geçersiz, süresi dolmuş, uygun güven yapılandırması olmadan kendi kendine imzalanmış veya bozuk bir sertifika zinciri).
- Ağ Bağlantısı Sorunları: El sıkışmayı bozan aralıklı ağ bağlantısı veya güven duvarı müdahalesi.
- Sunucu Tarafı Sorunları: Kaynak tükenmesi veya yanlış yapılandırma gibi uzak sunucudaki sorunlar.
Çözüm 1: Java Sürümünüzü Güncellemek
Eski Java sürümleri, bu hatanın birincil kaynağıdır. Birçok sunucu, eski ve daha az güvenli protokollerden uzaklaşmıştır. En son Java Uzun Süreli Destek (LTS) sürümüne güncelleme yapmak genellikle en basit ve en etkili çözümdür. Oracle’ın web sitesinden en son LTS sürümünü indirin, yükleyin ve uygulamanızın güncellenmiş Java sürümünü kullandığından emin olun.
Çözüm 2: SSL/TLS Protokollerini Yapılandırmak
Java, uygulamanızın kullandığı SSL/TLS protokollerini belirtmenize olanak tanır. Sunucu, uygulamanızın varsayılan protokollerini desteklemiyorsa, ayarları ayarlamanız gerekir. Bu genellikle izin verilen protokolleri belirtmek için SSLSocketFactory
veya SSLEngine
kullanmayı içerir.
SSLContext sslContext = SSLContext.getInstance("TLSv1.3"); // Veya TLSv1.2, vb.
sslContext.init(null, null, null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
Socket socket = sslSocketFactory.createSocket(hostname, port);
// ... kodunuzun geri kalanı ...
Uygulamanız ve sunucu tarafından desteklenen protokollerle "TLSv1.3"
‘ü değiştirin. Uygun bir tane bulana kadar farklı protokollerle (TLSv1.3, TLSv1.2, TLSv1.1) deneyin. Desteklenen protokolleri için sunucunun belgelerine bakın.
Çözüm 3: SSL Sertifikalarını Doğrulamak
Yanlış yapılandırılmış veya geçersiz SSL sertifikaları, bir diğer sık nedendir. Sertifikaları programatik olarak veya manuel olarak doğrulayabilirsiniz. Programatik olarak, sunucunun sertifikasını, kendi kendine imzalanmışsa veya standart olmayan bir Sertifika Yetkilisinden ise Java güven deponuza eklemeniz gerekebilir. Manuel olarak, sertifika geçerliliğini ve zincirini doğrulamak için openssl
gibi araçları kullanın. Sertifika geçersiz veya süresi dolmuşsa, sunucu yöneticisine başvurun.
Sorun Giderme ve Gelişmiş Teknikler
Önceki çözümler sorunu çözmezse, bu gelişmiş adımları göz önünde bulundurun:
- Ağ Bağlantısını Kontrol Edin: Güven duvarı kuralları da dahil olmak üzere ağ bağlantısını doğrulayın. Ağ sorunlarını teşhis etmek için
ping
vetraceroute
gibi araçları kullanın. - Sunucu Günlüklerini İnceleyin: Sorunu belirleyebilecek daha özel hata mesajları için sunucunun günlüklerini inceleyin.
- Proxy Ayarları: Bir proxy’nin arkasındaysanız, Java uygulamanızın onu doğru şekilde kullanacak şekilde yapılandırıldığından emin olun.
- SSL Hata Ayıklamasını Etkinleştirin: El sıkışma işlemi hakkında daha ayrıntılı bilgi edinmek için Java uygulamanızda SSL hata ayıklamasını etkinleştirin.
- Sunucu Yöneticisiyle İletişime Geçin: Tüm bunlar işe yaramazsa, sorunu bildirmek için sunucu yöneticisiyle iletişime geçin. El sıkışma başarısızlığına neden olan sunucu tarafı sorunları olabilir.
Sıkça Sorulan Sorular (SSS)
S: Sertifikam kendi kendine imzalanmış. Bunu nasıl düzeltebilirim?
Y: keytool
komut satırı yardımcı programını kullanarak kendi kendine imzalanmış sertifikayı Java anahtar deponuza (genellikle cacerts
) içe aktarın.
S: Sunucu kapalı. Bu nasıl bu hataya neden olur?
Y: Kapalı bir sunucu, bağlantı girişimi başarısız olduğu için başarılı bir el sıkışmayı engeller.
S: Ya bu çözümlerden hiçbiri işe yaramazsa?
Y: Ağ bağlantınızı, güven duvarı kurallarınızı kontrol edin ve sunucu yöneticisiyle iletişime geçmeyi düşünün. Sunucu tarafı sorunları olabilir.