Я працюю над підручником для веб-служб REST на веб-сайті www.udemy.com (REST Java Web Services). У прикладі підручника сказано, що для того, щоб мати SSL, ми повинні мати папку під назвою "trust_store" в проекті мого затемнення "клієнт", яка повинна містити файл "ключ зберігання" (у нас був проект "клієнт", щоб викликати службу , і "сервісний" проект, який містив веб-службу REST - 2 проекти в одній робочій області затемнення, один - клієнт, інший - сервіс). Щоб зробити все просто, вони сказали скопіювати "keystore.jks" з сервера додатків glassfish (glassfish \ domeins \ domain1 \ config \ keystore.jks), який ми використовуємо, і помістив його в цю папку "trust_store", яку вони мені створили проект клієнта. Це, мабуть, має сенс: самопідписані сертифікати на сервері " s key_store відповідатиме сертифікатам клієнтського trust_store. Тепер, роблячи це, я отримував помилку, про яку згадується в початковій публікації. Я переглянув це і прочитав, що помилка пов'язана з файлом "keystore.jks" на клієнті, що не містить довіреного / підписаного сертифіката, що сертифікат, який він знаходить, підписується самостійно.
Щоб ясність була зрозумілою, дозвольте мені сказати, що, наскільки я це розумію, "keystore.jks" містить самопідписані серти, а файл "cacerts.jks" містить сертифікати CA (підписані CA). "Keystore.jks" - це "keystore", а "cacerts.jks" - "магазин довіри". Як говорить вище коментатор "Бруно", "keystore.jks" є локальним, а "cacerts.jks" - для віддалених клієнтів.
Отже, я сказав собі, ей, у келіха також є файл "cacerts.jks", який є файлом trust_store файлу glassfish. cacerts.jsk повинен містити сертифікати CA. І, мабуть, мені потрібна папка trust_store, щоб містити файл зберігання ключів, який має принаймні один сертифікат CA. Отже, я спробував помістити файл "cacerts.jks" у папку "trust_store", яку я створив, на своєму клієнтському проекті та змінивши властивості VM, щоб вказати на "cacerts.jks" замість "keystore.jks". Це позбулося помилки. Я здогадуюсь, що все, що було потрібно, це CA CA для роботи.
Це може не бути ідеальним для виробництва, або навіть для розвитку, крім того, щоб просто отримати щось для роботи. Наприклад, ви, ймовірно, можете скористатися командою "keytool", щоб додати сертифікати CA у файл "keystore.jks" у клієнті. Але все одно сподіваємось, що це принаймні звужує можливі сценарії, які могли б відбуватися тут, щоб викликати помилку.
ТАКОЖ: мій підхід здавався корисним для клієнта (сервер cert додано до client trust_store), схоже, що коментарі вище для вирішення оригінальної публікації корисні для сервера (клієнт cert доданий до сервера trust_store). Ура.
Налаштування проекту Eclipse:
- MyClientProject
- src
- тест
- Системна бібліотека JRE
- ...
- trust_store
--- cacerts.jks --- keystore.jks
Фрагмент з файлу 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");
}
});
}