javax.net.ssl.SSLHandshakeException tek bir sorun değil, bir hata ailesidir. Önemli olan, istisnanın ardından gelen ayrıntı iletisidir; çünkü her ileti farklı bir katmana işaret eder.
İletiden nedene
| İleti | Olası neden |
|---|---|
| PKIX path building failed | Güven zinciri kurulamadı; kök/ara sertifika eksik |
| No subject alternative names present | Sertifika, bağlanılan ana bilgisayar adını kapsamıyor |
| Received fatal alert: handshake_failure | Ortak protokol veya cipher suite yok |
| No appropriate protocol | İstemcide TLS sürümleri devre dışı bırakılmış |
| Remote host terminated the handshake | Sunucu bağlantıyı erken kapattı (güvenlik duvarı, protokol uyumsuzluğu) |
| certificate_expired | Sertifika veya zincirdeki bir halka süresi dolmuş |
Teşhis adımları
- Bağlantıyı Java dışında deneyin:
openssl s_client -connect ornek.com:443 -servername ornek.com - Java'da el sıkışma günlüğünü açın:
-Djavax.net.debug=ssl:handshake. - Sunucunun desteklediği TLS sürümlerini ve cipher'ları karşılaştırın; istemci yalnızca TLS 1.0/1.1 sunuyorsa güncel sunucular reddeder.
- Protokolü zorlayarak deneyin:
java -Djdk.tls.client.protocols=TLSv1.2 -jar uygulama.jar - Ana bilgisayar adı uyuşmazlığında sertifikanın SAN alanını kontrol edin; adres IP ile çağrılıyorsa sertifikada IP SAN yoksa hata kaçınılmazdır.
Önleme
JDK'yı güncel tutun, java.security dosyasındaki jdk.tls.disabledAlgorithms ayarını gevşetmek yerine sunucuyu modernleştirin ve uygulama yapılandırmasında sertifika doğrulamasını kapatan "güven her şeyi" çözümlerinden kaçının; bunlar sorunu gizler, güvenliği ortadan kaldırır. Adı ve zinciri hızlıca kontrol etmek için SSL denetleme aracından, genel kılavuz için bilgi bankasından yararlanın.
Ek ipuçları
- İstemci ve sunucu arasında bir yük dengeleyici varsa hatayı veren uç o cihazdır; doğrudan arka uca bağlanarak karşılaştırın.
- Java sürümünüz eskiyse TLS 1.2 varsayılan olarak kapalı olabilir; JDK'yı güncellemek en doğru çözümdür.
- Günlükte görünen ClientHello içindeki sürüm ve cipher listesini sunucu ayarlarıyla yan yana koyarak ortak nokta olup olmadığına bakın.
Hata yalnızca belirli bir sunucuda çıkıyorsa o sunucunun yapılandırması, her yerde çıkıyorsa istemci ortamı şüphelidir; bu basit ayrım teşhis süresini kısaltır.
Özet: önce iletiyi okuyun, sonra ilgili katmanı (zincir, ad, protokol, cipher) tek tek eleyin.