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

Я пытаюсь получить твиты с помощью twitter4j библиотека для моего проекта Java. При первом запуске я получил сообщение об ошибке certificate sun.security.validator.ValidatorException и sun.security.provider.certpath.SunCertPathBuilderException. Затем я добавил сертификат twitter:

C:Program FilesJavajdk1.7.0_45jrelibsecurity>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:Program FilesJavajdk1.7.0_45jrelibsecuritycacerts"

но безуспешно. Вот процедура, чтобы получить щебечет:

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("Total amount of tweets: " + 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("Failed to search tweets: " + te.getMessage());
    }

и вот ошибка:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Relevant discussions can be found on the Internet at:
    http://www.google.co.jp/search?q=d35baff5 or
    http://www.google.co.jp/search?q=1446302e
TwitterException{exceptionCode=[d35baff5-1446302e 43208640-747fd158 43208640-747fd158 43208640-747fd158], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177)
    at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
    at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:81)
    at twitter4j.TwitterImpl.get(TwitterImpl.java:1929)
    at twitter4j.TwitterImpl.search(TwitterImpl.java:306)
    at jku.cc.servlets.TweetsAnalyzer.main(TweetsAnalyzer.java:38)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
    at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:34)
    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:141)
    ... 5 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at sun.security.validator.Validator.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    ... 20 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
    at java.security.cert.CertPathBuilder.build(Unknown Source)
    ... 26 more
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

21 ответов


  1. перейти к URL в браузере firefox, нажмите на HTTPS цепи сертификатов (рядом с URL-адресом). Нажмите "more info" > "security" > "show certificate" > "details" > "export..". Выберите имя и выберите пример типа файла.ССВ. Теперь у вас есть файл с keystore, и вы должны добавить его в свой JVM

  2. определить местоположение файлов 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/PC.

источник: http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html


после многих часов, пытаясь создать файлы сертификатов, чтобы моя установка Java 6 работала с новым сертификатом twitter, Я, наконец, наткнулся на невероятно простое решение, похороненное в комментарии на одной из досок объявлений. Просто скопируйте файл cacerts из установки Java 7 и перезапишите его в вашей установке Java 6. Вероятно, лучше сначала сделать резервную копию файла cacerts, но затем вы просто скопируете новый и бум! это просто работает.

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

файл находится в jre/lib/security/cacerts как в старых, так и в новых установках Java jdk.

надеюсь, это сэкономит кому-то еще часы обострения.


я наткнулся на эту проблему, которая заняла много часов исследований, чтобы исправить, особенно с автогенерированными сертификатами, которые, в отличие от официальных, довольно сложны, и Java не любит их так много.

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

в основном вам нужно добавить сертификат с сервера в сертификаты Java Home.

  1. создайте или получите сертификат и настройте Tomcat использовать его в серверах.в XML
  2. загрузите исходный код Java класса InstallCert и выполните его во время работы сервера, предоставив следующие аргументы server[:port]. Пароль не требуется, так как исходный пароль работает для сертификатов Java ("changeit").
  3. программа подключится к серверу и Java выдаст исключение, она проанализирует сертификат, предоставленный сервером и позволит вам создать jssecerts файл внутри каталога, где вы выполняется программа (если выполняется из Eclipse, убедитесь, что вы настроили рабочий каталог в Run -> Configurations).
  4. вручную скопируйте этот файл в $JAVA_HOME/jre/lib/security

после выполнения этих шагов соединения с сертификатом больше не будут генерировать исключения в Java.

следующий исходный код важен, и он исчез из (Sun) Oracle blogs, единственная страница, которую я нашел, была по ссылке, поэтому я прикрепляю ее в ответ для любой ссылки.

/*
 * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/**
 * Originally from:
 * http://blogs.sun.com/andreas/resource/InstallCert.java
 * Use:
 * java InstallCert hostname
 * Example:
 *% java InstallCert ecc.fedora.redhat.com
 */

import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 * Class used to add the server's certificate to the KeyStore
 * with your trusted certificates.
 */
public class InstallCert {

    public static void main(String[] args) throws Exception {
        String host;
        int port;
        char[] passphrase;
        if ((args.length == 1) || (args.length == 2)) {
            String[] c = args[0].split(":");
            host = c[0];
            port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
            String p = (args.length == 1) ? "changeit" : args[1];
            passphrase = p.toCharArray();
        } else {
            System.out.println("Usage: java InstallCert [:port] [passphrase]");
            return;
        }

        File file = new File("jssecacerts");
        if (file.isFile() == false) {
            char SEP = File.separatorChar;
            File dir = new File(System.getProperty("java.home") + SEP
                    + "lib" + SEP + "security");
            file = new File(dir, "jssecacerts");
            if (file.isFile() == false) {
                file = new File(dir, "cacerts");
            }
        }
        System.out.println("Loading KeyStore " + file + "...");
        InputStream in = new FileInputStream(file);
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(in, passphrase);
        in.close();

        SSLContext context = SSLContext.getInstance("TLS");
        TrustManagerFactory tmf =
                TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
        context.init(null, new TrustManager[]{tm}, null);
        SSLSocketFactory factory = context.getSocketFactory();

        System.out.println("Opening connection to " + host + ":" + port + "...");
        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
        socket.setSoTimeout(10000);
        try {
            System.out.println("Starting SSL handshake...");
            socket.startHandshake();
            socket.close();
            System.out.println();
            System.out.println("No errors, certificate is already trusted");
        } catch (SSLException e) {
            System.out.println();
            e.printStackTrace(System.out);
        }

        X509Certificate[] chain = tm.chain;
        if (chain == null) {
            System.out.println("Could not obtain server certificate chain");
            return;
        }

        BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in));

        System.out.println();
        System.out.println("Server sent " + chain.length + " certificate(s):");
        System.out.println();
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        for (int i = 0; i < chain.length; i++) {
            X509Certificate cert = chain[i];
            System.out.println
                    (" " + (i + 1) + " Subject " + cert.getSubjectDN());
            System.out.println("   Issuer  " + cert.getIssuerDN());
            sha1.update(cert.getEncoded());
            System.out.println("   sha1    " + toHexString(sha1.digest()));
            md5.update(cert.getEncoded());
            System.out.println("   md5     " + toHexString(md5.digest()));
            System.out.println();
        }

        System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
        String line = reader.readLine().trim();
        int k;
        try {
            k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
        } catch (NumberFormatException e) {
            System.out.println("KeyStore not changed");
            return;
        }

        X509Certificate cert = chain[k];
        String alias = host + "-" + (k + 1);
        ks.setCertificateEntry(alias, cert);

        OutputStream out = new FileOutputStream("jssecacerts");
        ks.store(out, passphrase);
        out.close();

        System.out.println();
        System.out.println(cert);
        System.out.println();
        System.out.println
                ("Added certificate to keystore 'jssecacerts' using alias '"
                        + alias + "'");
    }

    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

    private static String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 3);
        for (int b : bytes) {
            b &= 0xff;
            sb.append(HEXDIGITS[b >> 4]);
            sb.append(HEXDIGITS[b & 15]);
            sb.append(' ');
        }
        return sb.toString();
    }

    private static class SavingTrustManager implements X509TrustManager {

        private final X509TrustManager tm;
        private X509Certificate[] chain;

        SavingTrustManager(X509TrustManager tm) {
            this.tm = tm;
        }

        public X509Certificate[] getAcceptedIssuers() {
            throw new UnsupportedOperationException();
        }

        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            throw new UnsupportedOperationException();
        }

        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            this.chain = chain;
            tm.checkServerTrusted(chain, authType);
        }
    }
}

мой подход к пользовательскому интерфейсу:

  1. скачать http://www.keystore-explorer.org/
  2. открыть $переменной JAVA_HOME/JRE и/lib/безопасности/cacerts в
  3. введите PW: changeit (может быть changeme на Mac)
  4. импорт .файл crt

CMD-Line:

  1. keytool-importcert - file jetty.ЭЛТ -псевдоним причал -хранилище $переменной JAVA_HOME/JRE и/lib/безопасности/cacerts в
  2. введите PW: changeit (можно изменить на Mac)

у меня была немного другая ситуация, когда JDK и JRE 1.8.0_112 присутствовали в моей системе.

я импортировал новые сертификаты CA в [JDK_FOLDER]\jre\lib\security\cacerts используя уже известные команды:

keytool -import -trustcacerts -keystore cacerts -alias <new_ca_alias> -file <path_to_ca_cert_file>

тем не менее, я продолжал получать то же самое не удалось построить путь PKIX ошибка.

Я добавил отладочную информацию в Java CLI, используя java -Djavax.net.debug=all ... > debug.log. В debug.файл журнала, строка, начинающаяся с trustStore это: на самом деле указал на магазин cacerts находится в [JRE_FOLDER]\lib\security\cacerts.

в моем случае решение состояло в том, чтобы скопировать файл cacerts, используемый JDK (у которого был добавлен новый CAs) над тем, который использовался JRE, и это исправило проблему.


Я хотел импортировать сертификат для smtp.gmail.com

единственное решение работало для меня 1. Введите команду для просмотра этого сертификата

D:\openssl\bin\openssl.ехе s_client -подключения по протоколу SMTP.в Gmail.ком:465

  1. скопируйте и сохраните строки между " - - - - - начать сертификат -- - - - "и"- - - - - конец сертификата - - - - - " в файл, gmail.cer

  2. Run

    keytool-импорт-псевдоним smtp.gmail.com -keystore "%Переменной JAVA_HOME%/JRE и/lib/безопасности/cacerts в" -файл C:\Users\Admin\Desktop\gmail.cer

  3. введите пароль chageit

  4. нажмите Да, чтобы импортировать сертификат

  5. перезапустить java

теперь запустите команду и вы хорошо идти


1. Проверьте сертификат

попробуйте загрузить целевой URL-адрес в браузере и просмотреть сертификат сайта (обычно он доступен значком со знаком блокировки. Он находится в левой или правой части адресной строки браузера), истек ли он или не доверен по другой причине.

2. Установите последние версии JRE и JDK

новые версии обычно поставляются с обновленным набором доверенных сертификатов.

также, если это возможно, удалите старый версии. Это сделает ошибки неправильной конфигурации явными.

3. Проверьте свою конфигурацию:

  • проверьте, куда указывает переменная среды JAVA_HOME.
  • проверьте, какую версию java вы используете для запуска программы. В IntelliJ проверить:
    • Файл - > Структура Проекта... - >Настройки проекта - > Проект - > проект SDK:
    • Файл - > Структура Проекта... - >Настройки Платформы -> SDKs

4. Скопируйте все хранилище ключей из новой версии Java

если вы разрабатываете под JDK, отличным от последнего доступного-попробуйте заменить %JAVA_HOME%/jre/lib/security/cacerts файл с новым из последней установленной JRE (сначала сделайте резервную копию), как предлагает @jeremy-goodell в своем ответ

5. Добавить сертификат(ы) на ваш keystore

если ничто выше не решает вашу проблему, используйте keytool для сохранения сертификатов в хранилище ключей Java:

keytool -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit -importcert -alias <alias_name> -file <path_to_crt_file>

файл с сертификатом можно получить из браузера, как предлагает @MagGGG в своем ответ.

Примечание 1: Вам может потребоваться повторить это для каждого сертификата в цепочке к сертификату вашего сайта. Начните с корневого.

примечание 2: <alias_name> должно быть уникальным среди ключей в магазине или keytool покажет ошибку.

получить список всех сертификатов в хранилище вы можете беги:

keytool -list -trustcacerts -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

в случае если что-то пойдет не так, это поможет вам удалить сертификат из хранилища:

keytool -delete -alias <alias_name> -keystore "%JAVA_HOME%jre\lib\security\cacerts" -storepass changeit

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

Он используется для перехода проверки сертификата.


Предыстория:

Я получал следующую ошибку, когда я пытаюсь запустить mvn clean install в своем проекте и через NetBeans IDE clean and build option. Эта проблема связана с сертификатом, недоступным при загрузке через net beans IDE / через командную строку, но способным загружать файлы через браузер.

:

Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact com.java.project:product:jar:1.0.32 from/to repo-local (https://url/local-repo): sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target  

:

1. Скачать сертификат соответствующего Url-адреса:

  • запустите IE с помощью " run as adminstrator "(в противном случае мы не сможем загрузить сертификат)
  • введите url в IE ->https://url/local-repo (В моем случае этот url имел ненадежный сертификатenter image description here.)
  • загрузите сертификат, нажав на ошибку сертификата -> просмотр сертификата
  • вкладка "выбрать сведения" - > копировать в файл - > далее - > выбрать " DER - кодировке X. 509 (.CER)
  • сохраните сертификат в некотором месте, например : c:/user/sheldon/desktop/product - ... cer
  • поздравляю! вы успешно скачали сертификат для сайта

2. Теперь установите хранилище ключей, чтобы устранить проблему.

  • выполните команду keytool для добавления загруженного хранилища ключей в существующий файл сертификата.
  • Command: под командой в папка bin jdk (JAVA_HOME).

C:\Program файлы\Java\jdk1.8.0_141\jre\bin>keytool-импортсерт-файл "C:/user/sheldon/desktop/product.cer " - псевдоним продукта-хранилище ключей "C:/Program файлы / Java / jdk1.8.0_141/jre/lib/security / cacerts".

  • вам будет предложено ввести пароль. Введите пароль хранилища ключей: введите "changeit" снова для " доверять этому сертификату? [no]:", enter "да"!--22-->

пример команды команды/вывод строки:

keytool -importcert -file "C:/Users/sheldon/Desktop/product.cer" -alias product -keystore "C:/Program iles/Java/jdk1.8.0_141/jre/lib/security/cacerts"
Enter keystore password:
Trust this certificate? [no]:  yes
Certificate was added to keystore
  • Contgrats! теперь вы должны были избавиться от " pkix path building failed: sun.безопасность.поставщик.certpath.SunCertPathBuilderException " ошибка в IDE Netbeans.

это не конкретный ответ Twitter, но это вопрос, который возникает при поиске этой ошибки. Если ваша система получает эту ошибку при подключении к веб-сайту, что - видимому, иметь действительный сертификат при просмотре в веб-браузере, что, вероятно, означает этот веб-сайт имеет неполную цепочку сертификатов.

для краткого изложения проблемы: центры сертификации не используют свой корневой сертификат для подписания любого старого сертификат. Вместо этого они (обычно) подписывают средний сертификаты, у которых также установлен флаг Центра сертификации (то есть разрешено подписывать сертификаты). Затем, когда вы покупаете сертификат от CA, они подписывают ваш CSR с одним из этих промежуточных сертификатов.

ваше хранилище доверия Java, скорее всего, имеет только корневой сертификат, а не промежуточные.

неправильно настроенный сайт может вернуть просто их самоподписанный сертификат. Проблема: был подписан с промежуточным сертификатом, который не находится в вашем доверительном магазине. Браузеры будут обрабатывать эту проблему путем загрузки или использования кэшированного промежуточного сертификата; это максимизирует совместимость веб-сайта. Однако Java и такие инструменты, как OpenSSL, не будут. И это вызовет ошибку в вопросе.

Вы можете проверить это подозрение с помощью тест SSL Qualys. Если вы запустите это на сайте и написано

цепочка сертификатов этого сервера незавершенный.

тогда это подтверждает это. Вы также можете увидеть это, посмотрев пути сертификации и увидев текст Дополнительно Скачать.

как это исправить: администратору сервера необходимо настроить веб-сервер для возврата промежуточных сертификатов. Для Comodo, например, это, где .ca-bundle файл пригодится. Например, в конфигурации Apache с mod_ssl, вы должны использовать SSLCertificateChainFile настройки конфигурации. Для nginx, необходимо объединить промежуточные сертификаты и подписанный сертификат и использовать его в конфигурации сертификата SSL. Вы можете найти больше, выполнив поиск "неполной цепочки сертификатов" в интернете.


я столкнулся с этим вопросом, пытаясь установить плагин Cucumber-Eclipse в Eclipse через свой сайт обновления. Я получил ту же ошибку SunCertPathBuilderException:

Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
    Unable to read repository at http://cucumber.io/cucumber-eclipse/update-site/content.xml.
    sun.security.validator.ValidatorException: PKIX path building failed: 
   sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

хотя некоторые из других ответов уместны и полезны для данной ситуации этого вопроса, они, тем не менее, были бесполезными и вводящими в заблуждение для моей проблемы.

в моем случае проблема заключалась в том, что URL-адрес, предоставленный для их сайта обновления:

https://cucumber.io/cucumber-eclipse/update-site

однако при навигации к нему через браузер он перенаправляется на (обратите внимание на добавленное".на GitHub"):

http://cucumber.github.io/cucumber-eclipse/update-site/

таким образом, разрешение состоит в том, чтобы просто использовать перенаправленную версию URL-адреса сайта обновления при добавлении сайта обновления в eclipse.


добавлять cacerts не работает для меня. После включения журнала с флагом -Djavax.net.debug=all, затем узнал java чтение из jssecacerts.

импорт jssecacerts работала наконец.


здесь обычно такое исключение возникает, когда есть несоответствие в пути доверенного сертификата. Проверьте конфигурацию или путь, по которому этот сертификат сервера требуется для защищенной связи.


У меня такая же проблема на Ubuntu 15.10. Попробуйте загрузить плагин локально, например https://github.com/lmenezes/elasticsearch-kopf/archive/master.zip и установите с этой командой:

sudo /usr/share/elasticsearch/bin/plugin install file:/home/dev/Downloads/elasticsearch-kopf-master.zip

путь может отличаться в зависимости от вашей среды.

С уважением.


для меня выскочила ошибка сертификата, потому что у меня был скрипач, работающий в фоновом режиме, и это испортило сертификат. Он действует как прокси-сервер так близко, что и перезапустить eclipse.


Я столкнулся с той же проблемой и получил ее решение, используя следующие простые шаги:

1) Загрузите InstallCert.java от google

2) скомпилируйте его с помощью javac InstallCert.java

3) Запустите InstallCert.java с помощью Ява InstallCert.java, С именем хоста и портом https и нажмите "1"при запросе ввода. Он добавит "localhost" в качестве доверенного хранилища ключей и создаст файл с именем "jssecacerts" как ниже:

java InstallCert localhost: 443

4) скопируйте jssecacerts в папку $JAVA_HOME/jre/lib/security

основной источник для решения проблемы здесь:

https://ankurjain26.blogspot.in/2017/11/javaxnetsslsslhandshakeexception.html

с уважением,

Анкур


Это дополнение к ответу https://stackoverflow.com/a/36427118/1491414. Спасибо @MagGGG

  • пожалуйста, убедитесь, что у вас есть разрешение администратора
  • пожалуйста, используйте двойные кавычки для пути хранилища ключей (- keystore C:\Program файлы (x86)\Java\jre1.6.0_22\lib\security\cacerts"), поскольку в ОС Windows местом установки по умолчанию будут программные файлы, и вы получите ошибку из-за пространства между программными файлами.

я исправил это, используя метод ниже -

  1. скопируйте url, который имеет проблему подключения
  2. перейдите в Android Studio - > Настройки - >Настройки Http
  3. в "тестовом соединении" вставьте этот url-адрес и нажмите ok
  4. на Ok нажмите, Android Studio попросит импортировать сертификат этого url, импортируйте его
  5. вот именно. Больше ничего нельзя было сделать, и моя проблема исчезла. Не нужно перезапустите студию.

когда у вас есть выше ошибка с atlassian software ex. Джира!--5-->

2018-08-18 11:35:00,312 Caesium-1-4 WARN anonymous    Default Mail Handler [c.a.mail.incoming.mailfetcherservice] Default Mail Handler[10001]: javax.mail.MessagingException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target while connecting to host 'imap.xyz.pl' as user 'jira@xyz.pl' via protocol 'imaps, caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

вы можете добавить сертификаты в доверенное хранилище ключей (измените missing_ca на правильное имя сертификата):

keytool -importcert -file missing_ca.crt -alias missing_ca -keystore /opt/atlassian/jira/jre/lib/security/cacerts

если просят пароль поставить changeit и подтвердите y

после этого просто перезапустите jira.


причина, мы получаем выше ошибку в том, что JDK поставляется с большим количеством доверенных сертификатов Центра сертификации(CA) в файл под названием "cacerts", но этот файл не имеет понятия о нашем самозаверяющем сертификате. Другими словами, файл cacerts не имеет нашего самозаверяющего сертификата, импортированного и, следовательно, не рассматривает его как доверенный объект, и, следовательно, он дает вышеуказанную ошибку.

как исправить вышеуказанную ошибку

чтобы исправить вышеуказанную ошибку, все, что нам нужно, это импортировать самозаверяющий сертификат в файл cacerts.

сначала найдите файл cacerts. Нам нужно будет узнать местоположение JDK. Если вы запускаете приложение через одну из IDE, таких как Eclipse или IntelliJ Idea, перейдите в настройки проекта и выясните, что такое расположение JDK. Для e.g в Mac OS типичное расположение файла cacerts будет в этом месте / библиотека / Java / JavaVirtualMachines / {{JDK_version}} / содержание / главная/jre/lib / безопасность на машину окна это быть под {{Installation_directory}} / {{JDK_version}}/jre/lib / security

после того, как вы нашли файл cacerts, теперь нам нужно импортировать наш самозаверяющий сертификат в этот файл cacerts. Проверьте последнюю статью, если вы не знаете, как правильно создать самозаверяющий сертификат.

если у вас нет файла сертификата(.crt) и просто есть .файл jks, который вы можете создать .файл crt с помощью команды ниже. В случае, если у вас уже есть .ЭЛТ./PEM файл, то вы можете игнорировать ниже команды

##для создания сертификата из хранилища ключей(.файл JKS) ####

keytool -export -keystore keystore.jks -alias selfsigned -file selfsigned.crt

выше шаг будет генерировать файл с именем selfsigned.ЭЛТ.Теперь импортируйте сертификат в cacerts

Теперь добавьте сертификат в JRE/lib/security / cacerts (trustore)
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}
Теперь добавьте сертификат в JRE/lib/security / cacerts (trustore)
keytool -importcert -file selfsigned.crt -alias selfsigned -keystore {{cacerts path}}

для электронной.г

keytool -importcert -file selfsigned.nextgen.crt -alias selfsigned.nextgen -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

это все, перезагрузите приложение, и оно должно работать нормально. Если это все еще не работает и получите исключение рукопожатия SSL. Вероятно, это означает, что вы используете другой домен, зарегистрированный в сертификате.

Ссылке С подробным объяснением и пошаговым разрешением здесь.


цели:

  1. использовать https-соединения
  2. проверить цепи SSL
  3. не иметь дело с cacerts
  4. добавить сертификат в runtime
  5. не теряйте сертификаты от cacerts

как делать:

  1. определите собственное хранилище ключей
  2. поставить сертификат в keystore
  3. переопределить контекст SSL по умолчанию с нашим обычаем класс!--7-->
  4. ???
  5. прибыль

мой файл оболочки хранилища ключей:

public class CertificateManager {

    private final static Logger logger = Logger.getLogger(CertificateManager.class);

    private String keyStoreLocation;
    private String keyStorePassword;
    private X509TrustManager myTrustManager;
    private static KeyStore myTrustStore;

    public CertificateManager(String keyStoreLocation, String keyStorePassword) throws Exception {
        this.keyStoreLocation = keyStoreLocation;
        this.keyStorePassword = keyStorePassword;
        myTrustStore = createKeyStore(keyStoreLocation, keyStorePassword);
    }

    public void addCustomCertificate(String certFileName, String certificateAlias)
            throws Exception {
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init((KeyStore) null);
        Certificate certificate = myTrustStore.getCertificate(certificateAlias);
        if (certificate == null) {
            logger.info("Certificate not exists");
            addCertificate(certFileName, certificateAlias);
        } else {
            logger.info("Certificate exists");
        }
        tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(myTrustStore);
        for (TrustManager tm : tmf.getTrustManagers()) {
            if (tm instanceof X509TrustManager) {
                setMytrustManager((X509TrustManager) tm);
                logger.info("Trust manager found");
                break;
            }
        }
    }

    private InputStream fullStream(String fname) throws IOException {
        ClassLoader classLoader = getClass().getClassLoader();
        InputStream resource = classLoader.getResourceAsStream(fname);
        try {
            if (resource != null) {
                DataInputStream dis = new DataInputStream(resource);
                byte[] bytes = new byte[dis.available()];
                dis.readFully(bytes);
                return new ByteArrayInputStream(bytes);
            } else {
                logger.info("resource not found");
            }
        } catch (Exception e) {
            logger.error("exception in certificate fetching as resource", e);
        }
        return null;
    }

    public static KeyStore createKeyStore(String keystore, String pass) throws Exception {
        try {
            InputStream in = CertificateManager.class.getClass().getResourceAsStream(keystore);
            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(in, pass.toCharArray());
            logger.info("Keystore was created from resource file");
            return keyStore;
        } catch (Exception e) {
            logger.info("Fail to create keystore from resource file");
        }

        File file = new File(keystore);
        KeyStore keyStore = KeyStore.getInstance("JKS");
        if (file.exists()) {
            keyStore.load(new FileInputStream(file), pass.toCharArray());
            logger.info("Default keystore loaded");
        } else {
            keyStore.load(null, null);
            keyStore.store(new FileOutputStream(file), pass.toCharArray());
            logger.info("New keystore created");
        }
        return keyStore;
    }

    private void addCertificate(String certFileName, String certificateAlias) throws CertificateException,
            IOException, KeyStoreException, NoSuchAlgorithmException {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream certStream = fullStream(certFileName);
        Certificate certs = cf.generateCertificate(certStream);
        myTrustStore.setCertificateEntry(certificateAlias, certs);
        FileOutputStream out = new FileOutputStream(getKeyStoreLocation());
        myTrustStore.store(out, getKeyStorePassword().toCharArray());
        out.close();
        logger.info("Certificate pushed");
    }

    public String getKeyStoreLocation() {
        return keyStoreLocation;
    }

    public String getKeyStorePassword() {
        return keyStorePassword;
    }
    public X509TrustManager getMytrustManager() {
        return myTrustManager;
    }
    public void setMytrustManager(X509TrustManager myTrustManager) {
        this.myTrustManager = myTrustManager;
    }
}

этот класс при необходимости создаст хранилище ключей и сможет управлять сертификатами внутри него. Теперь класс для контекста SSL:

public class CustomTrustManager implements X509TrustManager {

    private final static Logger logger = Logger.getLogger(CertificateManager.class);

    private static SSLSocketFactory socketFactory;
    private static CustomTrustManager instance = new CustomTrustManager();
    private static List<CertificateManager> register = new ArrayList<>();

    public static CustomTrustManager getInstance() {
        return instance;
    }

    private X509TrustManager defaultTm;

    public void register(CertificateManager certificateManager) {
        for(CertificateManager manager : register) {
            if(manager == certificateManager) {
                logger.info("Certificate manager already registered");
                return;
            }
        }
        register.add(certificateManager);
        logger.info("New Certificate manager registered");
    }

    private CustomTrustManager() {
        try {
            String algorithm = TrustManagerFactory.getDefaultAlgorithm();
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);

            tmf.init((KeyStore) null);
            boolean found = false;
            for (TrustManager tm : tmf.getTrustManagers()) {
                if (tm instanceof X509TrustManager) {
                    defaultTm = (X509TrustManager) tm;
                    found = true;
                    break;
                }
            }
            if(found) {
                logger.info("Default trust manager found");
            } else {
                logger.warn("Default trust manager was not found");
            }

            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, new TrustManager[]{this}, null);
            SSLContext.setDefault(sslContext);
            socketFactory = sslContext.getSocketFactory();
            HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);


            logger.info("Custom trust manager was set");
        } catch (NoSuchAlgorithmException | KeyManagementException | KeyStoreException e) {
            logger.warn("Custom trust manager can't be set");
            e.printStackTrace();
        }
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        List<X509Certificate> out = new ArrayList<>();
        if (defaultTm != null) {
            out.addAll(Arrays.asList(defaultTm.getAcceptedIssuers()));
        }
        int defaultCount = out.size();
        logger.info("Default trust manager contain " + defaultCount + " certficates");
        for(CertificateManager manager : register) {
            X509TrustManager customTrustManager = manager.getMytrustManager();
            X509Certificate[] issuers = customTrustManager.getAcceptedIssuers();
            out.addAll(Arrays.asList(issuers));
        }
        logger.info("Custom trust managers contain " + (out.size() - defaultCount) + " certficates");
        X509Certificate[] arrayOut = new X509Certificate[out.size()];
        return out.toArray(arrayOut);
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
        for(CertificateManager certificateManager : register) {
            X509TrustManager customTrustManager = certificateManager.getMytrustManager();
            try {
                customTrustManager.checkServerTrusted(chain, authType);
                logger.info("Certificate chain (server) was aproved by custom trust manager");
                return;
            } catch (Exception e) {
            }
        }
        if (defaultTm != null) {
            defaultTm.checkServerTrusted(chain, authType);
            logger.info("Certificate chain (server) was aproved by default trust manager");
        } else {
            logger.info("Certificate chain (server) was rejected");
            throw new CertificateException("Can't check server trusted certificate.");
        }
    }

    @Override
    public void checkClientTrusted(X509Certificate[] chain,
                                   String authType) throws CertificateException {
        try {
            if (defaultTm != null) {
                defaultTm.checkClientTrusted(chain, authType);
                logger.info("Certificate chain (client) was aproved by default trust manager");
            } else {
                throw new NullPointerException();
            }
        } catch (Exception e) {
            for(CertificateManager certificateManager : register) {
                X509TrustManager customTrustManager = certificateManager.getMytrustManager();
                try {
                    customTrustManager.checkClientTrusted(chain, authType);
                    logger.info("Certificate chain (client) was aproved by custom trust manager");
                    return;
                } catch (Exception e1) {
                }
            }
            logger.info("Certificate chain (client) was rejected");
            throw new CertificateException("Can't check client trusted certificate.");
        }
    }

    public SSLSocketFactory getSocketFactory() {
        return socketFactory;
    }
}

этот класс сделан как одноэлементный, потому что разрешен только один контекст defaultSSL. Итак, теперь использование:

            CertificateManager certificateManager = new CertificateManager("C:\myapplication\mykeystore.jks", "changeit");
            String certificatePath = "C:\myapplication\public_key_for_your_ssl_service.crt";
            try {
                certificateManager.addCustomCertificate(certificatePath, "alias_for_public_key_for_your_ssl_service");
            } catch (Exception e) {
                log.error("Can't add custom certificate");
                e.printStackTrace();
            }
            CustomTrustManager.getInstance().register(certificateManager);

возможно, он не будет работать с этими настройками, потому что я храню файл сертификата внутри ресурса папка, поэтому мой путь не является абсолютным. Но в целом он работает отлично.