Saya memiliki klien Java yang mencoba mengakses server dengan sertifikat yang ditandatangani sendiri.
Ketika saya mencoba mengirim ke server, saya mendapatkan kesalahan berikut:
tidak dapat menemukan jalur sertifikasi yang valid ke target yang diminta
Setelah melakukan penelitian tentang masalah ini, saya kemudian melakukan hal berikut.
- Menyimpan nama domain server saya sebagai
root.cer
file. - Di JRE server Glassfish saya, saya menjalankan ini:
keytool -import -alias example -keystore cacerts -file root.cer
- Untuk memeriksa sertifikat yang berhasil ditambahkan ke cacert saya, saya melakukan ini:
keytool -list -v -keystore cacerts
Saya dapat melihat sertifikat itu ada. - Saya kemudian restart Glassfish dan pensiun 'pos'.
Saya masih mendapatkan kesalahan yang sama.
Saya merasa ini karena Glassfish saya sebenarnya tidak membaca file cacert yang telah saya ubah tetapi mungkin yang lain.
Adakah di antara Anda yang memiliki masalah ini dan dapat mendorong saya ke arah yang benar?
Jawaban:
Sayangnya - bisa jadi banyak hal - dan banyak server aplikasi dan 'pembungkus' java lainnya cenderung bermain dengan properti dan 'miliknya' mengambil gantungan kunci dan apa yang tidak. Jadi mungkin melihat sesuatu yang sama sekali berbeda.
Singkatnya penahan - Saya akan mencoba:
untuk melihat apakah itu membantu. Alih-alih 'semua', seseorang juga dapat mengaturnya ke 'ssl', manajer kunci dan manajer kepercayaan - yang dapat membantu dalam kasus Anda. Mengaturnya ke 'bantuan' akan mencantumkan sesuatu seperti di bawah ini di sebagian besar platform.
Apapun - pastikan Anda sepenuhnya memahami perbedaan antara keystore (di mana Anda memiliki kunci pribadi dan sertifikat Anda membuktikan identitas Anda sendiri dengan) dan toko kepercayaan (yang menentukan siapa yang Anda percayai) - dan fakta bahwa identitas Anda sendiri juga memiliki 'rantai' kepercayaan ke root - yang terpisah dari rantai apa pun ke root yang Anda butuhkan untuk mencari tahu 'siapa' yang Anda percayai.
Sumber: # Lihat http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug
sumber
Ini solusinya, ikuti tautan di bawah ini Langkah demi langkah:
http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/
FILE JAWA: yang hilang dari blog
sumber
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0];}
Anda perlu mengkonfigurasi Properti Sistem JSSE, secara khusus arahkan ke toko sertifikat klien.
Melalui baris perintah:
atau melalui kode Java:
Untuk lebih banyak merujuk pada detail di situs RedHat .
sumber
(repost dari respon saya yang lain )
Gunakan utilitas cli keytool dari distribusi perangkat lunak java untuk impor (dan kepercayaan! ) diperlukan sertifikat
Sampel:
Dari cli change dir ke jre \ bin
Periksa keystore (file yang ditemukan di jre \ direktori bin)
keytool -list -keystore .. \ lib \ security \ cacerts
Password changeit
Unduh dan simpan semua sertifikat dalam rantai dari server yang dibutuhkan.
Tambahkan sertifikat (sebelum harus menghapus atribut "read-only" pada file ".. \ lib \ security \ cacerts"), jalankan: keytool -ali REPLACE_TO_ANY_UNIQ_NAME -import -keystore .. \ lib \ keamanan \ cacerts -file "r: \ root.crt "
secara tidak sengaja saya menemukan tip yang sangat sederhana. Solusi lain memerlukan penggunaan InstallCert.Java dan JDK
sumber: http://www.java-samples.com/showtutorial.php?tutorialid=210
sumber
Saya memiliki masalah yang sama dengan sbt .
Itu mencoba mengambil dependensi dari repo1.maven.org lebih dari ssl
tetapi mengatakan itu "tidak dapat menemukan jalur sertifikasi yang valid untuk url target yang diminta".
jadi saya mengikuti posting ini dan masih gagal memverifikasi koneksi.
Jadi saya membacanya dan menemukan bahwa sertifikat root tidak cukup, seperti yang disarankan oleh pos, jadi -
hal yang berhasil bagi saya adalah mengimpor sertifikat perantara CA ke dalam keystore .
Saya sebenarnya menambahkan semua sertifikat dalam rantai dan itu bekerja seperti pesona.
sumber
Solusi saat bermigrasi dari JDK 8 ke JDK 10
certs
JDK 10
JDK 8
Langkah-langkah untuk memperbaikinya
jlink
sebagai/opt/jdk/bin/jlink \ --module-path /opt/jdk/jmods...
Jadi, inilah jalur yang berbeda dan urutan perintah ...
sumber
Saya sedang mengerjakan tutorial untuk layanan web REST di www.udemy.com (REST Java Web Services). Contoh dalam tutorial mengatakan bahwa untuk memiliki SSL, kita harus memiliki folder bernama "trust_store" di proyek "klien" gerhana saya yang harus berisi file "penyimpanan kunci" (kami memiliki proyek "klien" untuk memanggil layanan , dan proyek "layanan" yang berisi layanan web REST - 2 proyek di ruang kerja gerhana yang sama, satu klien, yang lain layanan). Untuk mempermudah, mereka mengatakan untuk menyalin "keystore.jks" dari server aplikasi glassfish (glassfish \ domains \ domain1 \ config \ keystore.jks) yang kami gunakan dan memasukkannya ke dalam folder "trust_store" yang mereka buat untuk saya buat proyek klien. Itu tampaknya masuk akal: sertifikat yang ditandatangani sendiri di server ' s key_store akan sesuai dengan sertifikat di trust_store klien. Sekarang, melakukan ini, saya mendapatkan kesalahan yang disebutkan oleh posting asli. Saya telah memeriksa ini di Google dan membaca bahwa kesalahan itu disebabkan oleh file "keystore.jks" pada klien yang tidak mengandung sertifikat tepercaya / tandatangani, bahwa sertifikat yang ditemukannya ditandatangani sendiri.
Agar semuanya tetap jelas, izinkan saya mengatakan bahwa seperti yang saya pahami, "keystore.jks" berisi sertifikat yang ditandatangani sendiri, dan file "cacerts.jks" berisi sertifikat CA (ditandatangani oleh CA). "Keystore.jks" adalah "keystore" dan "cacerts.jks" adalah "toko kepercayaan". Seperti yang dikatakan "Bruno", seorang komentator di atas, "keystore.jks" adalah lokal, dan "cacerts.jks" adalah untuk klien jarak jauh.
Jadi, saya berkata pada diri sendiri, hei, glassfish juga memiliki file "cacerts.jks", yang merupakan file trust_store glassfish. cacerts.jsk seharusnya berisi sertifikat CA. Dan ternyata saya membutuhkan folder trust_store saya untuk memuat file penyimpanan kunci yang memiliki setidaknya satu sertifikat CA. Jadi, saya mencoba meletakkan file "cacerts.jks" di folder "trust_store" yang saya buat, pada proyek klien saya, dan mengubah properti VM untuk menunjuk ke "cacerts.jks" bukannya "keystore.jks". Itu menghilangkan kesalahan. Saya kira yang dibutuhkan hanyalah sertifikat CA untuk bekerja.
Ini mungkin tidak ideal untuk produksi, atau bahkan untuk pengembangan lebih dari sekadar mendapatkan sesuatu untuk bekerja. Misalnya Anda mungkin bisa menggunakan perintah "keytool" untuk menambahkan sertifikat CA ke file "keystore.jks" di klien. Tapi bagaimanapun juga semoga ini setidaknya mempersempit skenario yang mungkin terjadi di sini untuk menyebabkan kesalahan.
JUGA: pendekatan saya sepertinya berguna untuk klien (cert server ditambahkan ke client trust_store), sepertinya komentar di atas untuk menyelesaikan posting asli berguna untuk server (cert klien ditambahkan ke server trust_store). Bersulang.
Penyiapan proyek Eclipse:
--- cacerts.jks --- keystore.jks
Cuplikan dari file MyClientProject.java:
sumber
Masalah saya adalah bahwa Broker Keamanan Akses Cloud, NetSkope, diinstal pada laptop pekerjaan saya melalui pembaruan perangkat lunak. Ini mengubah rantai sertifikat dan saya masih tidak dapat terhubung ke server melalui klien java saya setelah mengimpor seluruh rantai ke keystore cacerts saya. Saya menonaktifkan NetSkope dan berhasil terhubung.
sumber
Dalam kasus saya, saya menghadapi masalah karena dalam proses kucing jantan saya keystore tertentu diberikan menggunakan
Ketika saya mengimpor sertifikat ke cacert JRE / lib / security dan perubahannya tidak mencerminkan. Kemudian saya melakukan perintah di bawah ini di mana /tmp/cert1.test berisi sertifikat server target
Kami dapat memeriksa ulang apakah impor sertifikat berhasil
dan lihat apakah server taget Anda ditemukan terhadap alias rapidssl-myserver
sumber
Periksa apakah file itu
$JAVA_HOME/lib/security/cacerts
ada! Dalam kasus saya itu bukan file tetapi tautan ke/etc/ssl/certs/java/cacerts
dan juga ini adalah tautan ke sendiri (APA ???) jadi karena itu JVM tidak dapat menemukan file.Solusi: Salin file cacerts nyata ( Anda dapat melakukannya dari JDK lain ) ke
/etc/ssl/certs/java/
direktori dan itu akan menyelesaikan masalah Anda :)sumber
rm -f /opt/jdk-minimal/jre/lib/security/cacerts ; ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts
Katakanlah jika Anda menggunakan variabel classpath seperti $ {JAVA_HOME} di pom.xml.
Pada sasaran, tambahkan variabel classpath. yaitu .., -DANT_HOME, -DJAVA_HOME
sumber