Я работаю над учебным пособием для веб-служб REST по адресу www.udemy.com (веб-службы REST Java). В примере из учебника сказано, что для того, чтобы иметь SSL, в моем проекте клиента «eclipse» должен быть каталог «trust_store», который должен содержать файл «хранилища ключей» (у нас был проект «клиента» для вызова службы и «сервисный» проект, который содержал веб-сервис REST - 2 проекта в одной рабочей области Eclipse, один клиент, другой сервис). Для простоты они сказали скопировать «keystore.jks» с сервера приложений glassfish (glassfish \ domains \ domain1 \ config \ keystore.jks), который мы используем, и поместили его в эту папку «trust_store», которую они мне внесли в клиентский проект. Кажется, это имеет смысл: самоподписанные сертификаты на сервере s key_store будет соответствовать сертификатам в клиенте trust_store. Теперь, делая это, я получаю сообщение об ошибке, о котором говорится в оригинальном сообщении. Я прогуглил это и прочитал, что ошибка происходит из-за файла «keystore.jks» на клиенте, не содержащего доверенного / подписанного сертификата, что сертификат, который он находит, является самоподписанным.
Для ясности позвольте мне сказать, что, насколько я понимаю, «keystore.jks» содержит самозаверяющие сертификаты, а файл «cacerts.jks» содержит сертификаты CA (подписанные CA). «Keystore.jks» - это «keystore», а «cacerts.jks» - «хранилище доверенных сертификатов». Как сказал выше комментатор "Bruno", "keystore.jks" является локальным, а "cacerts.jks" - для удаленных клиентов.
Итак, я сказал себе: эй, у glassfish также есть файл "cacerts.jks", который является файлом trust_store glassfish. Предполагается, что cacerts.jsk содержит сертификаты CA. И, очевидно, мне нужно, чтобы в моей папке trust_store содержался файл хранилища ключей, в котором есть хотя бы один сертификат CA. Поэтому я попытался поместить файл «cacerts.jks» в созданную мной папку «trust_store» в своем клиентском проекте и изменить свойства виртуальной машины так, чтобы они указывали на «cacerts.jks» вместо «keystore.jks». Это избавило от ошибки. Я предполагаю, что все, что нужно, это сертификат CA для работы.
Это не может быть идеальным для производства, или даже для развития, за исключением просто заставить что-то работать. Например, вы можете использовать команду «keytool» для добавления сертификатов CA в файл «keystore.jks» на клиенте. Но в любом случае, надеюсь, это, по крайней мере, сужает возможные сценарии, которые могут происходить здесь, чтобы вызвать ошибку.
ТАКЖЕ: мой подход оказался полезным для клиента (сертификат сервера добавлен в клиент trust_store), похоже, что приведенные выше комментарии для разрешения исходного сообщения полезны для сервера (сертификат клиента добавлен в сервер trust_store). Приветствия.
Настройка проекта Eclipse:
- MyClientProject
- ЦСИ
- тест
- Системная библиотека 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");
}
});
}