"Ошибка построения пути 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

60 ответов

Решение
  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

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

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

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

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

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

  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)

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 предлагает в своем ответе

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

Если ничто иное не решает вашу проблему, используйте 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

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

Mac

Принятый ответ не работает для Mac, поскольку на Mac нет Exportкнопки (Chrome или Firefox). Пожалуйста, проверьте этот ответ, чтобы загрузить сертификат, и выполните следующие шаги, как указано ниже:

  1. Перечислите все сертификаты, установленные в хранилище ключей:
      cd $JAVA_HOME/jre/lib/security
keytool -list -keystore cacerts

Пароль по умолчанию для хранилища ключей: changeit

  1. Прежде чем импортировать сертификат в хранилище ключей, сделайте резервную копию хранилища ключей:
      sudo cp cacerts cacerts.bak
  1. Импортируйте загруженный сертификат в хранилище ключей:
      sudo keytool -importcert -alias youralias -file /path/to/the/downloaded/certificate -keystore cacerts
  1. Проверьте, хранится ли сертификат в хранилище ключей:
      sudo keytool -list -keystore cacerts -alias youralias

Если вы хотите увидеть более подробную информацию, добавьте -v флаг:

      sudo keytool -v -list -keystore cacerts -alias youralias

Я наткнулся на эту проблему, на решение которой ушло много часов исследований, особенно с автоматически сгенерированными сертификатами, которые, в отличие от официальных, довольно хитры, а 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);
        }
    }
}

Я хотел импортировать сертификат для 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. Введите пароль

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

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

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

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

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

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

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

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

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

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

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

У меня была немного другая ситуация, когда в моей системе присутствовали 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, и это решило проблему.

Потерпев полдня, нашел еще один способ решить эту проблему. Я смог решить эту проблему в MAC 10.15.5 ( Catalina). Выполнили следующие шаги.

  • Эта проблема возникает, когда мы используем прокси компании, в моем случае это Zscaler.
  • Откройте доступ к цепочке ключей, экспортируйте сертификат CA (выберите CA certificate, File->export items и сохраните с желаемым именем)
  • Скопируйте путь к существующим 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, и терминал начнет новый сеанс.

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

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

Ошибка:

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 имел ненадежный сертификат .)
  • Загрузите сертификат, нажав "Ошибка сертификата" -> просмотреть сертификат
  • Выберите вкладку "Сведения" -> "Копировать в файл" -> "Далее" -> "Выбрать" кодированный двоичный код DER. X.509 (.CER)
  • сохраните сертификат в каком-либо месте, например: c: /user/sheldon/desktop/product.cer
  • Congrats! Вы успешно загрузили сертификат для сайта

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

  • Выполните команду keytool, чтобы добавить загруженное хранилище ключей в существующий файл сертификата.
  • Команда: Команда ниже в папке 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: / Программные файлы /Java/jdk1.8.0_141/ JRE / Библиотека / безопасность / 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.

Это решение, но в форме моей истории с этой проблемой:

Я был почти мертв, пытаясь использовать все решения, указанные выше (в течение 3 дней), и у меня ничего не получалось.

Я потерял всякую надежду.

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

Я их отругал за то, что не сообщил разработчикам.

Позже они выпустили новый файл "cacerts", который содержит все сертификаты.

Я удалил файл cacerts, который находится внутри%JAVA_HOME%/jre/lib/security, и он решил мою проблему.

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

Причина, по которой мы получаем вышеупомянутую ошибку, состоит в том, что 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 на компьютере Windows, оно будет находиться в {{Installation_directory}}/{{JDK_version}}/ JRE / Библиотека / безопасность

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

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

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

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

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

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

Простые шаги для устранения этого исключения (я сделал это на java 11),

  • Сначала вам нужно загрузить общедоступный файл сертификата SSL целевого домена, который вы пытаетесь вызвать, для этого
  • Откройте веб-сайт целевого домена в Chrome (пример: https://amazonservice.domain.com )
  • Нажмите на маленький значок замка перед URL-адресом в браузере.
  • Щелкните Просмотреть сертификаты.
  • Теперь нажмите «Сертификат» действителен, как показано ниже.
  • Теперь откроется новое всплывающее окно, как показано ниже,
  • Откройте вкладку сведений
  • Выберите RootCert вверху
  • Нажмите «Экспорт» и сохраните файл .cer в своей системе в каталоге.

Теперь у вас есть общедоступное хранилище ключей вашего целевого домена, которое вы пытаетесь вызвать в своем приложении Java, теперь нам нужно добавить это хранилище ключей в ваш jre, для этого перейдите в каталог $JAVA_HOME/bin и выполните следующую команду

      ./keytool -importcert -alias someAliasName -keystore {JAVA_HOME}/lib/security/cacerts -file {PathToDownloads}/certificateFileName.cer

Он запросит у вас пароль, введите пароль, если вы знаете, пароль по умолчанию для сертификатаchangeit

Рекомендации

  1. https://confluence.atlassian.com/kb/how-to-import-a-public-ssl-certificate-into-a-jvm-867025849.html
  2. https://confluence.atlassian.com/kb/unable-to-connect-to-ssl-services-due-to-pkix-path-building-failed-error-779355358.html

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

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

Проблема в том, что ваше eclipse не может подключиться к сайту, который на самом деле пытается подключиться. Я столкнулся с аналогичной проблемой, и приведенное ниже решение сработало для меня.

  1. Отключите любые сторонние приложения для обеспечения безопасности в Интернете, например Zscaler.
  2. Иногда также необходимо отключить VPN, если вы подключены.

Спасибо

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

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

Эта проблема в основном связана с тем, что запрос блокируется приложением в нашей системе, которое защищает нас от кибератак.

В моем случае я попытался получить доступ к доверенной службе API, поэтому решил проблему, добавив сертификат zscaler в файлlib/security/cacertsфайл моего jdk 17, который используется в IDE, путем выполнения приведенной ниже команды keytool в cmd.

      keytool -keystore  "C:\dev\java\jdk-17.0.7\lib\security\cacerts" -import -alias zscalarCert -file "C:\Users\theri\Documents\zscalar-cert.crt"

password:- changeit

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

Если вы все еще получаете эту ошибку

      Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid 
certification path to requested target

после выполнения следующей команды

      keytool -import -alias certificatealias -keystore C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts -file certificate.crt

Тогда в JDK есть проблема. Попробуйте установить JDK от надежного провайдера. После того, как вы переустановили его у проверенного поставщика, вы не столкнетесь с этой проблемой.

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

Я решил эту проблему в Windows Server 2016 с Java 8, импортировав сертификат из pkcs12 хранить в cacertsхранилище ключей.

Путь к магазину pkcs12:
C:\Apps\pkcs12.pfx

Путь к Java cacerts:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

Путь к keytool:
C:\Program Files\Java\jre1.8.0_151\bin

После перехода в папку с keytool в командной строке (от имени администратора), команда для импорта сертификата из pkcs12 к cacerts составляет:
keytool -v -importkeystore -srckeystore C:\Apps\pkcs12.pfx -srcstoretype PKCS12 -destkeystore "C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts" -deststoretype JKS

Вам будет предложено:
1. ввести пароль целевого хранилища ключей (пароль cacerts, по умолчанию "changeit")
2. ввести пароль исходного хранилища ключей (пароль pkcs12)


Чтобы изменения вступили в силу, перезапустите сервер (или просто перезапустите JVM).

Я столкнулся с той же проблемой, но обновил неправильный jre на моей Linux-машине. [Весьма вероятно, что tomcat использует другой jre, а ваше приглашение cli настроено на использование другого jre].

Убедитесь, что вы выбираете правильный jre.

Шаг 1:

ps -ef | grep tomcat

Вы увидите что-то вроде:

root     29855     1  3 17:54 pts/3    00:00:42 /usr/java/jdk1.7.0_79/jre/bin/java 

Теперь используйте это:

keytool -import -alias example -keystore  /usr/java/jdk1.7.0_79/jre/lib/security/cacerts -file cert.cer
PWD: changeit

Файл *.cer можно сгенерировать, как показано ниже:[Или вы можете использовать свой собственный] openssl x509 -in cert.pem -outform pem -outform der -out cert.cer

Цели:

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

Как это сделать:

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

Файл оболочки My Keystore:

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);

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

Если 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>

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

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

Если вы столкнулись с проблемами со следующим исключением:

Проблема: javax.net.ssl.SSLHandshakeException: не удалось построить путь PKIX..... не удалось найти действительный путь сертификации к запрошенной цели.

Причина. Не удалось установить соединение SSL, поскольку на клиенте отсутствует требуемый сертификат сервера. Для стека приложений JAVA используется собственное хранилище сертификатов в расположениях JRE или JDK:

  1. JRE: jre/lib/security/cacerts
  2. JDK: :\Program Files\Java\jdk-11.0.15.1\lib/security/cacerts

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

keytool -import -alias {имя-сертификата} -keystore "{абсолютный-путь-каталога-cacerts}" -file {.cer-file-location}

Эта утилита использует пароль по умолчанию как «changeit». Пожалуйста, введите этот пароль при появлении соответствующего запроса.

Если keytool не распознается, обратите внимание, что этот .exe является частью папки bin JRE или JDK, поэтому добавление этого пути в переменную среды локального компьютера под названием «Путь» должно решить эту проблему.

1-Прежде всего, импортируйте свой crt файл в {JAVA_HOME} / jre / security / cacerts, если вы все еще столкнулись с этим исключением, измените свою версию jdk. Например из jdk1.8.0_17 к jdk1.8.0_231

Если ваш хост находится за брандмауэром / прокси, используйте следующую команду в cmd:

keytool -J-Dhttps.proxyHost=<proxy_hostname> -J-Dhttps.proxyPort=<proxy_port> -printcert -rfc -sslserver <remote_host_name:remote_ssl_port>

замещать <proxy_hostname> а также <proxy_port> с прокси-сервером HTTP, который настроен. замещать <remote_host_name:remote_ssl_port> с одним из удаленного хоста (в основном URL) и порта, имеющего проблему с сертификацией.

Возьмите последний напечатанный контент сертификата и скопируйте его (также скопируйте начало и конец сертификата). Вставьте его в текстовый файл и дайте ему расширение .crt. Теперь импортируйте этот сертификат в cacerts с помощью команды java keytool, и он должен работать.

keytool -importcert -file <filename>.crt -alias randomaliasname -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
Другие вопросы по тегам