Java'da "unable to find valid certification path to requested target" hatası, sunucu sertifikasının zinciri JVM güven deposunda bulunan bir köke bağlanamadığında çıkar. Zincirin sunucu tarafında eksik olmadığını doğruladıysanız, çözüm doğru kök veya ara sertifikayı güven deposuna eklemektir.
Ön koşullar
- Uygulamanızın hangi JDK/JRE ile çalıştığını bilin (
java -XshowSettings:properties -versionçıktısındajava.homedeğerine bakın). - Eklenecek sertifikayı güvenilir bir kaynaktan alın (CA'nın yayınladığı kök/ara sertifika).
- Değişiklik için yazma yetkiniz ve yedeğiniz olsun.
Sertifikayı keytool ile içe aktarma
- Mevcut deposunu yedekleyin ve sertifikanın zaten ekli olup olmadığına bakın.
- Sertifikayı ekleyin (varsayılan cacerts parolası genellikle
changeitdeğeridir, kurumunuzda değiştirilmiş olabilir):keytool -importcert -alias ornek-ca -file ornek-ca.crt \ -keystore "$JAVA_HOME/lib/security/cacerts" -storepass changeit - Sistem deposunu değiştirmek istemiyorsanız ayrı bir truststore oluşturun ve uygulamaya tanıtın:
keytool -importcert -alias ornek-ca -file ornek-ca.crt \ -keystore ozel-truststore.jks -storepass parola123 java -Djavax.net.ssl.trustStore=ozel-truststore.jks \ -Djavax.net.ssl.trustStorePassword=parola123 -jar uygulama.jar - Uygulamayı yeniden başlatın; JVM güven deposunu yalnızca açılışta yükler.
Doğrulama ve sık hatalar
İçe aktarmayı keytool -list -keystore ... -alias ornek-ca ile doğrulayın. Sık yapılan hatalar: yanlış JDK'nın deposunu değiştirmek (sistemde birden fazla Java olabilir), Docker imajında değişikliği imaj yeniden oluşturulurken kaybetmek ve yaprak sertifika yerine yanlış halkayı eklemek. Tomcat veya Spring Boot kullanıyorsanız truststore yolunu ilgili yapılandırma dosyasında da belirtmeniz gerekebilir.
Ek notlar
- Java 9 ve sonrasında cacerts dosyası
$JAVA_HOME/lib/security/cacertskonumundadır; Java 8'de$JAVA_HOME/jre/lib/security/cacertsolabilir. - Alias adları benzersiz olmalıdır; aynı adla ikinci içe aktarma hata verir.
- Çok sayıda uygulamanın paylaştığı bir JDK'da sistem deposunu değiştirmek diğer uygulamaları da etkiler; bu durumda ayrı truststore daha güvenlidir.
Kalıcılık için içe aktarma komutunu dağıtım betiğinize veya Dockerfile'a ekleyin. JDK güncellemesi cacerts dosyasını yenileyebileceğinden, eklediğiniz sertifikaların güncelleme sonrası yerinde durduğunu da kontrol edin.
Herkese açık bir siteye bağlanırken bu hatayı alıyorsanız önce sunucunun ara sertifikayı gönderip göndermediğini SSL denetleme aracıyla kontrol edin; sertifika temini için SSL sertifikaları sayfasına göz atabilirsiniz.