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:
- Proyek MyClient
- src
- uji
- Perpustakaan Sistem JRE
- ...
- trust_store
--- cacerts.jks --- keystore.jks
Cuplikan dari file MyClientProject.java:
static {
// Setup the trustStore location and password
System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks");
// comment out below line
System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
//System.setProperty("javax.net.debug", "all");
// for localhost testing only
javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
return hostname.equals("localhost");
}
});
}