Java uygulamaları sertifika zincirini kendi güven deposuyla (cacerts) doğrular. Zincir kurulamazsa şu ünlü hata çıkar:
javax.net.ssl.SSLHandshakeException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
Olası nedenler
- Sunucu ara sertifikayı göndermiyor; Java eksik halkayı kendisi indirmez.
- Bağlanılan sunucunun CA'sı JDK'nın güven deposunda yok (özel CA, kendinden imzalı sertifika, eski JDK).
- Kurumsal proxy trafiği kendi sertifikasıyla yeniden imzalıyor.
- Uygulama, sistemin değil başka bir JDK'nın
cacertsdosyasını kullanıyor.
Teşhis
El sıkışma ayrıntılarını görmek için JVM'e şu seçeneği verin:
java -Djavax.net.debug=ssl:handshake -jar uygulama.jar
Hangi sertifikaların geldiğini ve hangisinin reddedildiğini çıktıdan izleyin. Ayrıca sunucu tarafında openssl s_client -showcerts ile zincirin tam olup olmadığına bakın.
Çözüm
- Sunucu zinciri eksikse sorunu sunucuda düzeltin (ara sertifikayı ekleyin); en doğru çözüm budur.
- Özel CA kullanılıyorsa kök sertifikayı güven deposuna ekleyin (Java 9 ve üzerinde yol
$JAVA_HOME/lib/security/cacerts, eski sürümlerdejre/lib/security/cacerts):
keytool -importcert -trustcacerts -alias kurum-ca -file kok.crt -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit
Buradaki changeit varsayılan parolayı ifade eder; ortamınızda değiştirilmiş olabilir.
- Sistem deposunu değiştirmek istemiyorsanız uygulamaya özel bir truststore tanımlayın:
-Djavax.net.ssl.trustStore=/yol/truststore.jksve-Djavax.net.ssl.trustStorePassword=parola. - JDK sürümünüz çok eskiyse güncel bir sürüme geçmek yeni kökleri de kazandırır.
Uyarı
Doğrulamayı kodla devre dışı bırakan "hepsine güven" çözümlerinden kaçının; bağlantıyı güvensiz kılar. Sunucu tarafını SSL kontrol aracıyla doğrulayın, yeni sertifika için SSL sertifikalarına göz atın.