Sunting: - Mencoba memformat pertanyaan dan menerima jawaban dengan cara yang lebih rapi di Blog saya
Ini masalah aslinya.
Saya mendapatkan kesalahan ini:
Pesan rinci sun.security.validator.ValidatorException: PKIX bangunan path gagal:
kesalahan sun.security.provider.certpath.SunCertPathBuilderException: tidak dapat menemukan jalur sertifikasi yang valid untuk target yang dimintasebab javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: gagal membangun jalur PKIX: sun.security.provider.certpath.SunCertPathBuilderException: tidak dapat menemukan jalur sertifikasi yang valid untuk target yang diminta
Saya menggunakan Tomcat 6 sebagai server web. Saya memiliki dua aplikasi web HTTPS diinstal pada Tomcats berbeda pada port yang berbeda tetapi pada mesin yang sama. Katakan App1(port 8443)
dan
App2(port 443)
. App1
terhubung ke App2
. Ketika App1
terhubung ke App2
saya mendapatkan kesalahan di atas. Saya tahu ini adalah kesalahan yang sangat umum sehingga menemukan banyak solusi di berbagai forum dan situs. Saya memiliki entri di bawah ini server.xml
dari kedua Tomcats:
keystoreFile="c:/.keystore"
keystorePass="changeit"
Setiap situs mengatakan alasan yang sama bahwa sertifikat yang diberikan oleh app2 tidak ada di toko tepercaya app1 jvm. Ini tampaknya benar juga ketika saya mencoba untuk menekan URL yang sama di browser IE, itu berfungsi (dengan pemanasan, Ada masalah dengan sertifikat keamanan situs web ini. Di sini saya katakan lanjutkan ke situs web ini). Tetapi ketika URL yang sama terkena oleh klien Java (dalam kasus saya) saya mendapatkan kesalahan di atas. Jadi untuk meletakkannya di truststore saya mencoba tiga opsi ini:
Pilihan 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Pengaturan Opsi2 di bawah ini dalam variabel lingkungan
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Pengaturan Opsi3 di bawah ini dalam variabel lingkungan
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Tapi tidak ada yang berhasil .
Apa yang akhirnya berhasil adalah mengeksekusi pendekatan Java yang disarankan dalam Bagaimana menangani sertifikat SSL yang tidak valid dengan Apache HttpClient? oleh Pascal Thivent yaitu menjalankan program InstallCert.
Tetapi pendekatan ini baik untuk pengaturan devbox tapi saya tidak bisa menggunakannya di lingkungan produksi.
Saya bertanya-tanya mengapa tiga pendekatan yang disebutkan di atas tidak bekerja ketika saya sebutkan nilai yang sama di server.xml
dari app2
server dan sama nilai-nilai dalam truststore oleh pengaturan
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
dalam app1
program.
Untuk informasi lebih lanjut, inilah cara saya membuat koneksi:
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
reply.load(conn1.getInputStream());
domainname
di server RHEL saya masalahnya hilang. Semoga ini bisa membantu seseorang.Jawaban:
Anda perlu menambahkan sertifikat untuk App2 ke file truststore dari JVM bekas yang terletak di
%JAVA_HOME%\lib\security\cacerts
.Pertama, Anda dapat memeriksa apakah sertifikat Anda sudah ada di truststore dengan menjalankan perintah berikut:
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"
(Anda tidak perlu memberikan kata sandi)Jika sertifikat Anda hilang, Anda bisa mendapatkannya dengan mengunduhnya dengan browser Anda dan menambahkannya ke truststore dengan perintah berikut:
keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>
Setelah impor, Anda dapat menjalankan perintah pertama lagi untuk memeriksa apakah sertifikat Anda ditambahkan.
Informasi Sun / Oracle dapat ditemukan di sini .
sumber
keytool error: java.io.FileNotFoundException ... (Access is denied)
saat Anda mencoba mengimpor sertifikat Anda.• Ketika saya mendapatkan kesalahan, saya mencoba untuk Google keluar arti dari ekspresi dan saya menemukan, masalah ini terjadi ketika server mengubah sertifikat SSL HTTPS mereka, dan versi java kami yang lebih lama tidak mengenali otoritas sertifikat akar (CA) .
• Jika Anda dapat mengakses URL HTTPS di browser Anda, maka dimungkinkan untuk memperbarui Java untuk mengenali root CA.
• Di browser Anda, buka URL HTTPS yang tidak dapat diakses Java. Klik pada rantai sertifikat HTTPS (ada ikon kunci di Internet Explorer), klik kunci untuk melihat sertifikat.
• Pergi ke "Detail" dari sertifikat dan "Salin ke file". Salin dalam format Base64 (.cer) . Ini akan disimpan di Desktop Anda.
• Instal sertifikat dengan mengabaikan semua peringatan.
• Inilah cara saya mengumpulkan informasi sertifikat URL yang saya coba akses.
Sekarang saya harus membuat versi java saya untuk mengetahui tentang sertifikat sehingga lebih jauh tidak menolak untuk mengenali URL. Dalam hal ini saya harus menyebutkan bahwa saya googled out bahwa informasi sertifikat root tetap secara default di lokasi keamanan \ jre \ lib \ JDK , dan kata sandi default untuk mengakses adalah: changeit.
Untuk melihat informasi cacerts, berikut adalah prosedur yang harus diikuti:
• Klik pada Tombol Mulai -> Jalankan
• Ketikkan cmd. Command prompt terbuka (Anda mungkin perlu membukanya sebagai administrator).
• Pergi ke
Java/jreX/bin
direktori Anda• Ketikkan yang berikut ini
Ini memberikan daftar sertifikat saat ini yang terkandung dalam keystore. Itu terlihat seperti ini:
• Sekarang saya harus memasukkan sertifikat yang sebelumnya diinstal ke dalam cacerts.
• Untuk ini, berikut adalah prosedurnya:
Jika Anda menggunakan Java 7:
• Ini kemudian akan menambahkan informasi sertifikat ke dalam file cacert.
Ini adalah solusi yang saya temukan untuk Pengecualian yang disebutkan di atas !!
sumber
Cara kerja-nya di Tomcat 7
Saya ingin mendukung sertifikat yang ditandatangani sendiri di Aplikasi Tomcat tetapi cuplikan berikut gagal berfungsi
Inilah yang memecahkan masalah saya:
1) Unduh
.crt
file<your domain>
dengan domain Anda (mis.jossef.com
)2) Terapkan
.crt
file dicacerts
toko sertifikat Java<your domain>
dengan domain Anda (mis.jossef.com
)<JAVA HOME>
dengan direktori home java Anda3) Retas
Meskipun saya telah menginstal sertifikat saya di
Java
toko sertifikat default, Tomcat mengabaikan hal itu (sepertinya tidak dikonfigurasi untuk menggunakan toko sertifikat default Java).Untuk meretas ini, tambahkan berikut ini di suatu tempat dalam kode Anda:
sumber
Dalam kasus saya masalahnya adalah server web hanya mengirim sertifikat dan CA perantara, bukan root CA. Menambahkan opsi JVM ini menyelesaikan masalah:
-Dcom.sun.security.enableAIAcaIssuers=true
Sumber
sumber
Alasan lain bisa jadi versi JDK yang sudah ketinggalan zaman. Saya menggunakan jdk versi 1.8.0_60, hanya memperbarui ke versi terbaru memecahkan masalah sertifikat.
sumber
File cacerts saya benar-benar kosong. Saya memecahkan ini dengan menyalin file cacerts dari mesin windows saya (yang menggunakan Oracle Java 7) dan scp'd ke kotak Linux saya (OpenJDK).
dan kemudian pada mesin linux
Sejauh ini itu bekerja dengan baik.
sumber
Bagi saya, kesalahan ini juga muncul saat mencoba menyambung ke proses di belakang proxy terbalik NGINX yang menangani SSL.
Ternyata masalahnya adalah sertifikat tanpa seluruh rantai sertifikat digabungkan. Ketika saya menambahkan sertifikat menengah, masalahnya terpecahkan.
Semoga ini membantu.
sumber
Menggunakan Tomcat 7 di Linux, ini berhasil.
Di Linux,
$JAVA_HOME
tidak selalu pengaturan, tetapi biasanya/etc/alternatives/jre
menunjuk ke$JAVA_HOME/jre
sumber
Kode di bawah ini berfungsi untuk saya:
sumber
Saya menggunakan
jdk1.8.0_171
ketika saya menghadapi masalah yang sama. Saya mencoba 2 solusi teratas di sini (menambahkan sertifikat menggunakan keytool dan solusi lain yang memiliki peretasan di dalamnya) tetapi mereka tidak bekerja untuk saya.Saya meningkatkan JDK saya ke
1.8.0_181
dan itu bekerja seperti pesona.sumber
saya menulis skrip win32 (WinXP 32bit kecil) bodoh cmd (commandline) script yang mencari semua versi java dalam file program dan menambahkan cert kepada mereka. Kata sandi harus berupa "changeit" default atau ubah sendiri dalam skrip :-)
sumber
Untuk MacOS X di bawah ini adalah perintah yang tepat untuk saya di mana saya harus mencoba dengan tanda hubung ganda dalam opsi 'importcert' yang berfungsi:
sumber
Bagi saya tidak bekerja solusi yang diakui dari pos ini: https://stackoverflow.com/a/9619478/4507034 .
Sebaliknya, saya berhasil menyelesaikan masalah dengan mengimpor sertifikasi ke sertifikasi tepercaya mesin saya.
Langkah:
https://localhost:8443/yourpath
) Tempat sertifikasi tidak berfungsi.Manage computer certificates
Trusted Root Certification Authorities
->Certificates
your_certification_name.cer
file Anda di sini .sumber
Untuk Tomcat yang berjalan di server Ubuntu, untuk mengetahui Java mana yang digunakan, gunakan perintah "ps -ef | grep tomcat":
Sampel:
Kemudian, kita bisa masuk ke: cd /usr/local/java/jdk1.7.0_15/jre/lib/security
File cacerts default ada di sini. Masukkan sertifikat yang tidak dipercaya ke dalamnya.
sumber
untuk keselamatan kita tidak boleh menggunakan sertifikat yang ditandatangani sendiri dalam implementasi kita. Namun, ketika datang ke pengembangan sering kita harus menggunakan lingkungan percobaan yang mendapat sertifikat yang ditandatangani sendiri. Saya mencoba untuk memperbaiki masalah ini secara terprogram dalam kode saya dan saya gagal. Namun, dengan menambahkan sertifikat ke toko kepercayaan jre memperbaiki masalah saya. Silakan temukan langkah-langkah di bawah ini,
Unduh sertifikat situs,
Salin sertifikat (mis: cert_file.cer) ke direktori $ JAVA_HOME \ Jre \ Lib \ Security
Buka CMD di Administrator dan ubah direktori menjadi $ JAVA_HOME \ Jre \ Lib \ Security
Impor sertifikat ke toko kepercayaan menggunakan perintah di bawah ini,
Jika Anda mendapat kesalahan mengatakan keytool tidak dikenali, silakan merujuk ini.
Ketik ya seperti di bawah ini
Memperbarui
Jika server aplikasi Anda JBoss coba tambahkan properti sistem di bawah ini
Semoga ini membantu!
sumber
SOLUSI YANG DAPAT DITAWARKAN (Alpine Linux)
Untuk dapat memperbaiki masalah ini di lingkungan aplikasi kami, kami telah menyiapkan perintah terminal Linux sebagai berikut:
Akan menghasilkan file cert di direktori home.
Menginstal perintah ini openssl di Linux alpine. Anda dapat menemukan perintah yang tepat untuk distribusi Linux lainnya.
Menghasilkan file cert yang diperlukan.
Menerapkan file yang dihasilkan ke JRE dengan program 'keytool'.
Catatan: Silakan ganti DNS Anda dengan
<host-dns-ssl-belongs>
Note2: Harap dicatat dengan lembut bahwa
-noprompt
tidak akan meminta pesan verifikasi (ya / tidak) dan-storepass changeit
parameter akan menonaktifkan prompt kata sandi dan memberikan kata sandi yang diperlukan (standarnya adalah 'ubah'). Dua properti ini akan memungkinkan Anda menggunakan skrip-skrip itu di lingkungan aplikasi Anda seperti membangun gambar Docker.Note3 Jika Anda menggunakan aplikasi Anda melalui Docker, Anda dapat membuat file rahasia satu kali dan memasukkannya ke file proyek aplikasi Anda. Anda tidak perlu membuatnya lagi dan lagi.
sumber
Saya punya masalah ini juga.
Saya mencoba hampir semuanya dengan menambahkan sertifikat SSL ke .keystore, tetapi, itu tidak berfungsi dengan Java1_6_x. Bagi saya itu membantu jika kita mulai menggunakan versi Java yang lebih baru, Java1_8_x sebagai JVM.
sumber
Saya mengalami masalah dengan Android Studio ini ketika saya berada di belakang proxy. Saya menggunakan Crashlytics yang mencoba mengunggah file pemetaan saat membangun.
Saya menambahkan sertifikat proxy yang hilang ke truststore yang berlokasi di
/Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts
dengan perintah berikut:
keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]
misalnya dengan kata sandi truststore default
keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt
sumber
Hanya hack kecil. Perbarui URL dalam file "hudson.model.UpdateCenter.xml" dari https ke http
sumber
Saya ingin berpadu karena saya memiliki lingkungan QEMU di mana saya harus mengunduh file dalam java. Ternyata
/etc/ssl/certs/java/cacerts
di QEMU memang ada masalah karena tidak cocok dengan/etc/ssl/certs/java/cacerts
di lingkungan host. Lingkungan host ada di belakang proksi perusahaan sehingga java cacerts adalah versi yang disesuaikan.Jika Anda menggunakan lingkungan QEMU, pastikan sistem host dapat mengakses file terlebih dahulu. Misalnya Anda dapat mencoba skrip ini di mesin host Anda terlebih dahulu untuk melihatnya. Jika skrip berjalan dengan baik di mesin host tetapi tidak di QEMU, maka Anda mengalami masalah yang sama seperti saya.
Untuk mengatasi masalah ini, saya harus membuat cadangan file asli di QEMU, menyalin file di lingkungan host ke penjara chroot QEMU, dan kemudian java dapat mengunduh file secara normal di QEMU.
Solusi yang lebih baik akan dipasang
/etc
ke lingkungan QEMU; namun saya tidak yakin apakah file lain akan terkena dampak dalam proses ini. Jadi saya memutuskan untuk menggunakan solusi yang jelek tapi mudah ini.sumber
Ini sepertinya tempat yang bagus untuk mendokumentasikan alasan lain yang mungkin untuk pesan kesalahan PKIX yang terkenal itu. Setelah menghabiskan terlalu lama melihat isi keystore dan truststore dan berbagai konfigurasi instalasi java saya menyadari bahwa masalah saya adalah ke ... kesalahan ketik.
Kesalahan pengetikan berarti saya juga menggunakan keystore sebagai truststore. Karena perusahaan saya Root CA tidak didefinisikan sebagai sertifikat mandiri di keystore tetapi hanya sebagai bagian dari rantai sertifikat, dan tidak didefinisikan di tempat lain (yaitu cacerts), saya terus mendapatkan kesalahan PKIX.
Setelah rilis yang gagal (ini adalah konfigurasi conf, itu ok di tempat lain) dan dua hari menggaruk kepala akhirnya saya melihat kesalahan ketik, dan sekarang semua baik-baik saja.
Semoga ini bisa membantu seseorang.
sumber
tambahkan ini ke kode Anda:
sumber