"Не удалось построить путь PKIX" и "Не удается найти действительный сертификат для запрашиваемого ресурса"
Проблема с получением твитов с использованием библиотеки twitter4j в Java
Я пытаюсь получить твиты, используя библиотеку twitter4j для моего проекта на Java, который в своей реализации использует java.net.HttpURLConnection
(как видно из трассировки стека). При первом запуске я получил ошибку, связанную с сертификатом: sun.security.validator.ValidatorException
и sun.security.provider.certpath.SunCertPathBuilderException
.
Для решения этой проблемы я добавил сертификат Twitter, выполнив следующую команду:
C:\Program Files\Java\jdk1.7.0_45\jre\lib\security>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts"
Однако это не помогло. Вот код, который я использую для получения твитов:
public static void main(String[] args) throws TwitterException {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
.setOAuthConsumerKey("myConsumerKey")
.setOAuthConsumerSecret("myConsumerSecret")
.setOAuthAccessToken("myAccessToken")
.setOAuthAccessTokenSecret("myAccessTokenSecret");
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
try {
Query query = new Query("iphone");
QueryResult result;
result = twitter.search(query);
System.out.println("Общее количество твитов: " + result.getTweets().size());
List<Status> tweets = result.getTweets();
for (Status tweet : tweets) {
System.out.println("@" + tweet.getUser().getScreenName() + " : " + tweet.getText());
}
} catch (TwitterException te) {
te.printStackTrace();
System.out.println("Не удалось найти твиты: " + te.getMessage());
}
}
Вот ошибка, которую я получаю:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
Failed to search tweets: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Я буду благодарен за помощь в решении этой проблемы. Почему добавление сертификата не сработало, и как я могу правильно настроить подключение для получения твитов?
5 ответ(ов)
Чтобы добавить сертификат в ваше Java-приложение, выполните следующие шаги:
Перейдите по URL в вашем браузере:
- Firefox: нажмите на цепочку сертификатов HTTPS (значок замка рядом с адресом URL). Затем нажмите на
"Дополнительная информация" > "Безопасность" > "Показать сертификат" > "Детали" > "Экспорт.."
. Выберите имя файла и формат, например, example.cer. - Chrome: нажмите на иконку сайта слева от адресной строки, выберите "Сертификат" → "Детали" → "Экспорт" и сохраните в формате "Der-encoded binary, single certificate".
- Firefox: нажмите на цепочку сертификатов HTTPS (значок замка рядом с адресом URL). Затем нажмите на
Теперь у вас есть файл с сертификатом, и его нужно добавить в ваш JVM. Определите местоположение файла cacerts, например:
C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts
Далее импортируйте файл
example.cer
в cacerts через командную строку (может понадобиться запуск от имени администратора):keytool -import -alias example -keystore "C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts" -file example.cer
Вам будет предложено ввести пароль, по умолчанию это
changeit
.
После выполнения этих шагов перезагрузите вашу JVM или компьютер.
Источник: MagicMonster
После многих часов мучений с созданием сертификатов для работы моей установки Java 6 с новыми сертификатами Twitter, я наконец наткнулся на невероятно простое решение, зарытое в комментарии на одном из форумов. Просто скопируйте файл cacerts из установки Java 7 и перезапишите им файл в вашей установке Java 6. Лучше всего сначала сделать резервную копию файла cacerts, а затем просто скопируйте новый файл, и БАЦ! — все заработало.
Обратите внимание, что я фактически скопировал файл cacerts из Windows на установку Linux, и это сработало без проблем.
Файл находится по адресу jre/lib/security/cacerts
как в старой, так и в новой установках JDK Java.
Надеюсь, это сэкономит кому-то часы нервотрепки.
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
Эти параметры используются для отключения проверки сертификатов SSL.
Предупреждение!
Используйте только в целях разработки, так как это небезопасно!
Чтобы импортировать сертификат для smtp.gmail.com
, я нашел, что единственное решение, которое сработало для меня, следующее:
Введите следующую команду, чтобы просмотреть сертификат:
D:\openssl\bin\openssl.exe s_client -connect smtp.gmail.com:465
Скопируйте и сохраните строки между
-----BEGIN CERTIFICATE-----
и-----END CERTIFICATE-----
в файлgmail.cer
.Выполните команду:
keytool -import -alias smtp.gmail.com -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file C:\Users\Admin\Desktop\gmail.cer
Введите пароль:
changeit
.Подтвердите импорт сертификата, нажав "Yes".
Перезапустите Java.
Теперь вы можете снова запустить команду, и все должно заработать.
После того как я полдня мучился с этой проблемой, наконец нашёл ещё один способ её решения. Мне удалось решить это на Mac под управлением macOS 10.15.5 (Catalina). Следуйте приведённым ниже шагам.
- Проблема возникает, когда мы работаем за корпоративным прокси; в моём случае это Zscaler.
- Откройте "Доступ к связке ключей" и экспортируйте сертификат CA. (Выберите сертификат CA, затем выберите
Файл -> Экспортировать элементы
и сохраните с желаемым именем.) - Скопируйте путь к существующему файлу cacerts из папки Java:
/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/security/cacerts
. - Откройте терминал и перейдите в папку Keytool:
/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/bin
. - Выполните следующую команду:
Например:keytool -importcert -file (путь к экспортированному сертификату из "Доступа к связке ключей") -alias (дайте имя) -keystore (путь к существующему файлу cacerts из папки Java)
sudo keytool -importcert -file /Users/Desktop/RootCA.cer -alias demo -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/security/cacerts
- Вам будет предложено ввести пароль; введите:
changeit
. - После этого вас попросят подтвердить действие — ответьте: да.
После выполнения всех этих шагов закройте Eclipse и терминал, а затем перезапустите сессию.
Как работают сервлеты? Инстанцирование, сессии, общие переменные и многопоточность
Разница между StringBuilder и StringBuffer
Java 8: Преобразование List<V> в Map<K, V>
Возможные значения конфигурации hbm2ddl.auto в Hibernate и их назначение
Что такое PECS (Producer Extends Consumer Super)?