it-swarm.com.ru

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

Я пытаюсь получить твиты, используя Twitter4j библиотеку для моего проекта Java. При первом запуске я получил ошибку о сертификате Sun.security.validator.ValidatorException и Sun.security.provider.certpath.SunCertPathBuilderException. Затем я добавил сертификат в Твиттер:

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("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
264
Dozent
  1. Перейдите по ссылке URL в браузере Firefox, щелкните цепочку сертификатов HTTPS (рядом с адресом URL). Нажмите "more info" > "security" > "show certificate" > "details" > "export..". Выберите название и выберите тип файла example.cer. Теперь у вас есть файл с хранилищем ключей, и вы должны добавить его в 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/ПК.

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

351
MagGGG

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

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

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

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

68
Jeremy Goodell

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

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

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

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

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

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

/*
 * 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);
        }
    }
}
23
will824

МОЙ пользовательский интерфейс:

  1. Скачать http://www.keystore-Explorer.org/
  2. Откройте $ Java_HOME/jre/lib/security/cacerts
  3. введите PW: changeit (можно изменить на Mac)
  4. Импортируйте ваш файл .crt

CMD-Line:

  1. keytool -importcert -file jetty.crt -alias jetty -keystore $ Java_HOME/jre/lib/security/cacerts
  2. введите PW: changeit (можно изменить на Mac)
21
Mike Mitterer

У меня была немного другая ситуация, когда в моей системе присутствовали 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.log строка, начинающаяся с trustStore: фактически указывает на хранилище cacerts, найденное в [JRE_FOLDER]\lib\security\cacerts

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

11
M. F.

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

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

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

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

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

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

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

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

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

5. Добавьте сертификат (ы) в ваше хранилище ключей

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

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

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

Примечание 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
10
Lu55

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

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

D:\openssl\bin\openssl.exe s_client -connect smtp.gmail.com:465

  1. Скопируйте и сохраните строки между "----- BEGIN CERTIFICATE -----" и "----- END CERTIFICATE -----" в файл gmail.cer

  2. Бежать

    keytool -import -alias smtp.gmail.com -keystore Файл "% Java_HOME%/jre/lib/security/cacerts" C:\Users\Admin\Desktop\gmail.cer

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

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

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

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

6
Sneha Shejwal

История вопроса: 

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

Ошибка:

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 с помощью «Запуск от имени администратора» (иначе мы не сможем загрузить сертификат)
  • Введите URL в IE-> https: // url/local-repo (В моем случае этот URL имел ненадежный сертификат  enter image description here ).
  • Загрузите сертификат, нажав «Ошибка сертификата» -> просмотреть сертификат
  • Выберите вкладку «Сведения» -> «Копировать в файл» -> «Далее» -> «Выбрать» кодированный двоичный код DER X.509 (.CER). 
  • сохраните сертификат в каком-либо месте, например: c: /user/sheldon/desktop/product.cer 
  • Congrats! Вы успешно загрузили сертификат для сайта

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

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

C:\Program Files\Java\jdk1.8.0_141\jre\bin> keytool -importcert -file "C: /user/sheldon/desktop/product.cer" -alias product -keystore "C:/Program Files/Java/jdk1.8.0_141/jre/lib/security/cacerts".

  • Вам будет предложено ввести пароль. Введите пароль хранилища ключей: Введите «changeit» еще раз для «Доверять этому сертификату? [No]:», введите «Yes»

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

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: Sun.security.provider.certpath.SunCertPathBuilderException» в вашей среде IDE Netbeans. 
4
Barani r

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

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

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

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

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

Цепочка сертификатов этого сервера неполная.

тогда это подтверждает. Вы также можете увидеть это, посмотрев пути сертификации и увидев текст Extra Download.

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

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

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

2
gorums

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

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

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

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

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

Если у вас нет файла сертификата (.crt) и у вас просто есть файл .jks, вы можете сгенерировать файл .crt с помощью команды ниже. Если у вас уже есть файл .crt/.pem, вы можете проигнорировать следующую команду

## Для генерации сертификата из хранилища ключей (файл .jks) ####

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

Выше шаг будет сгенерирован файл с именем selfsigned.crt.Now Импортировать сертификат в cacerts

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. Это, вероятно, означает, что вы используете другой домен, зарегистрированный в сертификате.

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

2
Abhishek Galoda

Я столкнулся с этим вопросом, пытаясь установить плагин 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.

2
royfripple

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

Наконец-то сработал импорт в jssecacerts.

2
alk453

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

0
Atihska

Если у вас есть выше ошибка с Atlassian Software Ex. JIRA

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 '[email protected]' 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.

0
Karol Murawski

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

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

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

  1. Скопируйте URL, который имеет проблему с подключением
  2. Зайдите в Android Studio-> Настройки-> Настройки Http
  3. В «Test Connection» вставьте этот URL и нажмите ОК
  4. При нажатии Ok Android Studio попросит импортировать сертификат этого Url, импортировать его
  5. Вот и все. Больше ничего не поделаешь, и моя проблема исчезла. Нет необходимости Перезагрузить студию, а также.
0
AndroDev

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

0
Smart Coder

Если URL-адрес вашего хранилища также работает по протоколу HTTP и безопасность не представляет проблемы, вы можете перейти к settings.xml (часто, но не всегда, в %USERPROFILE%/.m2) и заменить HTTPS на HTTP для <repository> и <pluginRepository> URL-адреса.

Например, это:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>

следует заменить на это:

<repository>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
    <id>central</id>
    <name>libs-release</name>
    <url>https://<artifactory>/libs-release</url>
</repository>
0
ROMANIA_engineer

Я использовал свое собственное хранилище доверия, а не JRE, передав arg -Djavax.net.ssl.trustStore=

Я получаю эту ошибку независимо от сертификатов в доверенном хранилище. Для меня проблемой было упорядочение свойств, передаваемых по строке arg. Когда я поставил -Djavax.net.ssl.trustStore= & -Djavax.net.ssl.trustStorePassword= перед аргументами -Dspring.config.location= & -jar, я смог успешно вызвать мой оставшийся вызов через https. 

0
jasonoriordan

у меня та же проблема на 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

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

С уважением. 

0
user1379218

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

0
ketan

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

1) Загрузите InstallCert.Java с Google

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

3) Запустите InstallCert.Java, используя 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

0
Ankur jain