Saya terhubung dengan VPN untuk menyiapkan API inventaris untuk mendapatkan daftar produk dan berfungsi dengan baik. Setelah saya mendapatkan hasil dari layanan web dan saya mengikat ke UI. Dan juga saya mengintegrasikan PayPal dengan aplikasi saya untuk melakukan pembayaran Ekspres ketika saya melakukan panggilan untuk pembayaran, saya menghadapi kesalahan ini. Saya menggunakan servlet untuk proses back-end. Adakah yang bisa mengatakan bagaimana memperbaiki masalah ini?
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
Jawaban:
Pertama, Anda perlu mendapatkan sertifikat publik dari server yang Anda coba sambungkan. Itu dapat dilakukan dengan berbagai cara, seperti menghubungi admin server dan memintanya, menggunakan OpenSSL untuk mengunduhnya , atau, karena ini tampak seperti server HTTP, menghubungkannya dengan browser apa pun, melihat info keamanan halaman , dan menyimpan salinan sertifikat. (Google seharusnya dapat memberi tahu Anda apa yang harus dilakukan untuk browser spesifik Anda.)
Sekarang setelah Anda memiliki sertifikat yang disimpan dalam sebuah file, Anda perlu menambahkannya ke penyimpanan kepercayaan JVM Anda. Di
$JAVA_HOME/jre/lib/security/
untuk JRE atau$JAVA_HOME/lib/security
untuk JDK, ada file bernamacacerts
, yang disertakan dengan Java dan berisi sertifikat publik dari Otoritas Pemberi Sertifikat yang terkenal. Untuk mengimpor sertifikat baru, jalankan keytool sebagai pengguna yang memiliki izin untuk menulis ke cacerts:Kemungkinan besar akan meminta Anda untuk memasukkan kata sandi. Kata sandi default yang dikirimkan dengan Java adalah
changeit
. Hampir tidak ada yang mengubahnya. Setelah Anda menyelesaikan langkah-langkah yang relatif sederhana ini, Anda akan berkomunikasi dengan aman dan dengan jaminan bahwa Anda berbicara dengan server yang tepat dan hanya server yang tepat (selama mereka tidak kehilangan kunci privatnya).sumber
Sekarang saya memecahkan masalah ini dengan cara ini,
Tentu saja solusi ini hanya boleh digunakan dalam skenario, di mana tidak mungkin untuk menginstal sertifikat yang diperlukan menggunakan
keytool
misalnya pengujian lokal dengan sertifikat sementara.sumber
Setiap kali kami mencoba menyambung ke URL,
jika server di situs lain berjalan pada protokol https dan mengamanatkan bahwa kami harus berkomunikasi melalui informasi yang diberikan dalam sertifikat, maka kami memiliki opsi berikut:
1) minta sertifikat (unduh sertifikat), impor sertifikat ini di trustore. Penggunaan java trustore default dapat ditemukan di \ Java \ jdk1.6.0_29 \ jre \ lib \ security \ cacerts, maka jika kita mencoba kembali untuk menyambung ke sambungan URL akan diterima.
2) Dalam kasus bisnis normal, kami mungkin terhubung ke URL internal dalam organisasi dan kami tahu bahwa itu benar. Dalam kasus seperti itu, Anda percaya bahwa itu adalah URL yang benar. Dalam kasus seperti di atas, kode dapat digunakan yang tidak akan mengamanatkan untuk menyimpan sertifikat untuk terhubung ke URL tertentu.
untuk poin no 2 kita harus mengikuti langkah-langkah di bawah ini:
1) tulis di bawah metode yang menetapkan HostnameVerifier untuk HttpsURLConnection yang mengembalikan nilai true untuk semua kasus yang berarti kita mempercayai trustStore.
2) tulis metode di bawah ini, yang memanggil doTrustToCertificates sebelum mencoba menyambung ke URL
Panggilan ini akan mengembalikan kode respons = 200 berarti koneksi berhasil.
Untuk detail lebih lanjut dan contoh contoh Anda dapat merujuk ke URL .
sumber
SSLHandshakeException dapat diselesaikan dengan 2 cara.
Memasukkan SSL
Dapatkan SSL (dengan meminta administrator sistem sumber, juga dapat diunduh dengan perintah openssl, atau browser apa pun mengunduh sertifikat)
Tambahkan sertifikat ke truststore (cacerts) yang terletak di JRE / lib / security
berikan lokasi truststore dalam argumen vm sebagai "-Djavax.net.ssl.trustStore ="
Mengabaikan SSL
Untuk # 2 ini, silakan kunjungi jawaban saya yang lain di situs web stackoverflow lainnya: Cara menggunakan verifikasi SSL Abaikan Kesalahan Sertifikat SSL dengan Java
sumber
Saya yakin Anda mencoba menyambung ke sesuatu menggunakan SSL tetapi ada sesuatu yang memberikan sertifikat yang tidak diverifikasi oleh otoritas sertifikasi root seperti verisign .. Intinya secara default, sambungan aman hanya dapat dibuat jika orang yang mencoba menyambungkan tahu kunci counterparties atau beberapa verndor lain seperti verisign dapat turun tangan dan mengatakan bahwa kunci publik yang diberikan memang benar ..
SEMUA OS mempercayai segelintir otoritas sertifikasi dan penerbit sertifikat yang lebih kecil perlu disertifikasi oleh salah satu pemberi sertifikasi besar yang membuat rantai pemberi sertifikasi jika Anda mengerti maksud saya ...
Kembali ke intinya .. Saya memiliki masalah yang sama ketika memprogram applet java dan server java (Mudah-mudahan suatu hari nanti saya akan menulis posting blog lengkap tentang bagaimana saya mendapatkan semua keamanan untuk bekerja :))
Intinya apa yang harus saya lakukan adalah mengekstrak kunci publik dari server dan menyimpannya di keystore di dalam applet saya dan ketika saya terhubung ke server saya menggunakan penyimpanan kunci ini untuk membuat pabrik kepercayaan dan pabrik kepercayaan itu untuk membuat ssl koneksi. Ada juga prosedur alterante seperti menambahkan kunci ke host tepercaya JVM dan mengubah penyimpanan kepercayaan default saat memulai ..
Saya melakukan ini sekitar dua bulan yang lalu dan tidak memiliki kode sumber pada saya sekarang .. gunakan google dan Anda harus dapat memecahkan masalah ini. Jika Anda tidak dapat mengirim pesan kepada saya kembali dan saya dapat memberikan Anda kode sumber yang relevan untuk proyek tersebut .. Tidak tahu apakah ini menyelesaikan masalah Anda karena Anda belum memberikan kode yang menyebabkan pengecualian ini. Selanjutnya saya bekerja dengan applet pikir saya tidak bisa melihat mengapa itu tidak berfungsi di Serverlets ...
PS Saya tidak bisa mendapatkan kode sumber sebelum akhir pekan karena SSH eksternal dinonaktifkan di kantor saya :(
sumber
Sekarang saya memecahkan masalah ini dengan cara ini,
sumber