Редагувати: - На моєму блозі спробували відформатувати питання та прийняту відповідь більш презентабельно
Ось оригінальний випуск.
Я отримую цю помилку:
докладне повідомлення sun.security.validator.ValidatorException: Не вдалося побудувати шлях PKIX:
sun.security.provider.certpath.SunCertPathBuilderException: не вдалося знайти дійсний шлях сертифікації до потрібної цілівикликати javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Не вдалося побудувати шлях PKIX: sun.security.provider.certpath.SunCertPathBuilderException: не вдалося знайти дійсний шлях сертифікації до потрібної цілі
Я використовую Tomcat 6 як веб-сервер. У мене є два веб-додатки HTTPS, встановлені на різних Tomcats на різних портах, але на одній машині. Скажи App1(port 8443)
і
App2(port 443)
. App1
підключається до App2
. Коли App1
підключається до App2
мене, я отримую вищезгадану помилку. Я знаю, що це дуже поширена помилка, тому натрапила на багато рішень на різних форумах та сайтах. У мене є наступний запис server.xml
обох Tomcats:
keystoreFile="c:/.keystore"
keystorePass="changeit"
Кожен сайт говорить з тієї ж причини, що сертифікат, наданий app2, не знаходиться в надійному магазині app1 jvm. Це здається правдою і тоді, коли я намагався потрапити на ту саму URL-адресу в браузері IE, вона спрацьовує (із потеплінням. Існує проблема із сертифікатом безпеки цього веб-сайту. Ось, я кажу, продовжуйте цей веб-сайт). Але коли клієнт Java потрапляє на ту саму URL-адресу (в моєму випадку), я отримую вищезгадану помилку. Отож, щоб сказати про це, я спробував три варіанти:
Варіант1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Варіант2 Налаштування нижче в змінній середовища
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Варіант3 Налаштування нижче в змінній середовища
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Але нічого не вийшло .
Що, нарешті, працювало, це виконувати підхід Java, запропонований у розділі Як поводитися з недійсними сертифікатами SSL за допомогою Apache HttpClient? Pascal Thivent, тобто виконання програми InstallCert.
Але такий підхід відмінно підходить для налаштування devbox, але я не можу його використовувати у виробничих умовах.
Я задаюся питання, чому три згаданих вище підходи не зробили роботу , коли я згадав той же значення server.xml
з app2
сервера і ті ж значення в налаштуванні з допомогою довірених сертифікатів
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
в app1
програмі.
Для отримання додаткової інформації це з'єднання:
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
на моїх серверах RHEL проблема не зникла. Сподіваюся, це комусь допоможе.