9

"Не удалось построить путь PKIX" и "Не удается найти действительный сертификат для запрашиваемого ресурса"

9

Проблема с получением твитов с использованием библиотеки 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 ответ(ов)

11

Чтобы добавить сертификат в ваше Java-приложение, выполните следующие шаги:

  1. Перейдите по URL в вашем браузере:

    • Firefox: нажмите на цепочку сертификатов HTTPS (значок замка рядом с адресом URL). Затем нажмите на "Дополнительная информация" > "Безопасность" > "Показать сертификат" > "Детали" > "Экспорт..". Выберите имя файла и формат, например, example.cer.
    • Chrome: нажмите на иконку сайта слева от адресной строки, выберите "Сертификат" → "Детали" → "Экспорт" и сохраните в формате "Der-encoded binary, single certificate".
  2. Теперь у вас есть файл с сертификатом, и его нужно добавить в ваш JVM. Определите местоположение файла cacerts, например:

    C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts
    
  3. Далее импортируйте файл 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

1

После многих часов мучений с созданием сертификатов для работы моей установки Java 6 с новыми сертификатами Twitter, я наконец наткнулся на невероятно простое решение, зарытое в комментарии на одном из форумов. Просто скопируйте файл cacerts из установки Java 7 и перезапишите им файл в вашей установке Java 6. Лучше всего сначала сделать резервную копию файла cacerts, а затем просто скопируйте новый файл, и БАЦ! — все заработало.

Обратите внимание, что я фактически скопировал файл cacerts из Windows на установку Linux, и это сработало без проблем.

Файл находится по адресу jre/lib/security/cacerts как в старой, так и в новой установках JDK Java.

Надеюсь, это сэкономит кому-то часы нервотрепки.

0
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

Эти параметры используются для отключения проверки сертификатов SSL.

Предупреждение!

Используйте только в целях разработки, так как это небезопасно!

0

Чтобы импортировать сертификат для smtp.gmail.com, я нашел, что единственное решение, которое сработало для меня, следующее:

  1. Введите следующую команду, чтобы просмотреть сертификат:

    D:\openssl\bin\openssl.exe s_client -connect smtp.gmail.com:465
    
  2. Скопируйте и сохраните строки между -----BEGIN CERTIFICATE----- и -----END CERTIFICATE----- в файл gmail.cer.

  3. Выполните команду:

    keytool -import -alias smtp.gmail.com -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file C:\Users\Admin\Desktop\gmail.cer
    
  4. Введите пароль: changeit.

  5. Подтвердите импорт сертификата, нажав "Yes".

  6. Перезапустите Java.

Теперь вы можете снова запустить команду, и все должно заработать.

0

После того как я полдня мучился с этой проблемой, наконец нашёл ещё один способ её решения. Мне удалось решить это на Mac под управлением macOS 10.15.5 (Catalina). Следуйте приведённым ниже шагам.

  1. Проблема возникает, когда мы работаем за корпоративным прокси; в моём случае это Zscaler.
  2. Откройте "Доступ к связке ключей" и экспортируйте сертификат CA. (Выберите сертификат CA, затем выберите Файл -> Экспортировать элементы и сохраните с желаемым именем.)
  3. Скопируйте путь к существующему файлу cacerts из папки Java: /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/lib/security/cacerts.
  4. Откройте терминал и перейдите в папку Keytool: /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/jre/bin.
  5. Выполните следующую команду:
    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
    
  6. Вам будет предложено ввести пароль; введите: changeit.
  7. После этого вас попросят подтвердить действие — ответьте: да.

После выполнения всех этих шагов закройте Eclipse и терминал, а затем перезапустите сессию.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь