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

423

Я пытаюсь получить твиты, используя библиотеку 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
Dozent
источник
6
Здравствуйте, пожалуйста, проверьте ниже URL. Я уверен, что это поможет вам. java-samples.com/showtutorial.php?tutorialid=210 confluence.atlassian.com/display/JIRAKB/… . Вы должны добавить свой ssl-сертификат в сертификат хранилища доверенных сертификатов java (путь: jre / lib / security / cacerts).
Sus007
Пожалуйста, обратитесь к этому ответу для решения плюс подтвердить, что вы упаковываете свое программное обеспечение в комплекте jre? если да, то скопируйте вашу файловую систему cacerts и замените этот упакованный файл jre cacerts.
positivecrux
попробуйте это stackoverflow.com/a/9210661/4741746 может быть, это ваш ответ
sushant Госави
2
Я только что использовал этот код Java, и для https не забудьте указать порт как 443. Код Java на github.com/escline/InstallCert/blob/master/InstallCert.java. Он примет ваш файл CACERTS и добавит все эти плюсы. текущий сертификат для URL, который вы даете в качестве входных данных. В моем случае я жестко закодировал значения для host = "mywebservice.uat.xyz.com"; порт = 443; ключевая фраза = "changeit" .toCharArray (); Затем программа создает новый файл с именем «jssecacerts», в котором будет все. Переименуйте это в "cacerts" и используйте это. У вас все будет готово.
Reddymails

Ответы:

575
  1. Перейдите по ссылке в вашем браузере:
    • Firefox - нажмите на цепочку сертификатов HTTPS (значок замка прямо рядом с URL-адресом). Нажмите "more info" > "security" > "show certificate" > "details" > "export..". Выберите имя и выберите тип файла example.cer
    • chrome - нажмите на иконку сайта слева для адресации в адресной строке, выберите «Сертификат» -> «Детали» -> «Экспорт» и сохраните в формате «Der-закодированный двоичный файл, один сертификат».
  2. Теперь у вас есть файл с хранилищем ключей, и вы должны добавить его в JVM. Определите местоположение файлов cacerts, например. C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

  3. Затем импортируйте example.cerфайл в cacerts в командной строке:

keytool -import -alias example -keystore C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts -file example.cer

Вам будет предложено ввести пароль, по умолчанию changeit

Перезагрузите JVM / ПК.

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

MagGGG
источник
27
Мне пришлось поместить путь в кавычки, а также сохранить его как Base64 вместо DER
Теодор К.
3
вау..это сработало как волшебство, кстати, в chrome вы просто щелкаете значок замка в левой адресной строке, а затем нажимаете подробности плюс перезапуск не требуется
aswzen
8
Обратите внимание, что инструкции должны повторяться для всех сертификатов в цепочке. Также aliasимя сертификата в командной строке должно быть уникальным.
Lu55
5
Если ваш дом является JDK, убедитесь, что вы указали, что jre находится внутри этого файла: keytool -import -alias example -keystore "C: \ Program Files \ Java \ jdk1.8.0_73 \ jre \ lib \ security \ cacerts" -file example.cer
Джек БеНимбл
12
Для тех, кто получает ошибку «отказано в доступе», убедитесь, что вы используете командную строку от имени администратора.
Уокер Кристи
81

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

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

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

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

Джереми Гуделл
источник
4
Я пытаюсь получить доступ к ssl-серверу с помощью самозаверяющего сертификата, пытался добавить его сертификат с помощью keytool, но безрезультатно, есть предложения?
Олег Белоусов
1
Рад, что это сработало .. Но знаете ли вы, что было основной причиной. что привело к сбою сертификатов java 6 .. и как сертификаты java 7 устранили проблему
Vishwanath gowda k
Это было сделано, хотя я перешел с icedtea 1.6 на oracle 1.7. :)
nperson325681
Также рассмотрите это решение: stackoverflow.com/questions/33439905/…
Piohen
10
Для тех, кто любит меня, иногда упускаю очевидное - убедитесь, что вы не понимаете $JAVA_HOME/jre/lib, $JAVA_HOME/lib- я потратил немного времени, упуская эту деталь.
Райан Хиткот
36

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

  1. Загрузите проводник ключей здесь
  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
На Mac с CMD-Line следует использовать sudo для запуска команды. # sudo keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts
малайзи
1
На Windows команда, которая работает:keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts”
Патрисио Бонилья
где взять файл сертификата? Я не могу сказать, по какому URL перейти. jetty.com ?
kraftydevil
Я получил свой сертификат, экспортировав его из веб-браузера, контекстное действие на замке
rtbf
28

Я наткнулся на эту проблему, на решение которой ушло много часов исследований, особенно с автоматически сгенерированными сертификатами, которые, в отличие от официальных, довольно хитры, а 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);
        }
    }
}
will824
источник
2
Обратите внимание, что созданный файл - jssecacerts!
DeanDP
Я попытался использовать это решение для Java 7 и 8. Во время работы на Java 7 я получил protocol_version или handshake_failure для всех URL-адресов удаленных репозиториев, которые я пробовал. SandeepanNath:test sandeepan.nath$ java InstallCert repo1.maven.org:443 Loading KeyStore /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/security/cacerts... Opening connection to repo1.maven.org:443 ... Starting SSL handshake... javax.net.ssl.SSLException: Received fatal alert: protocol_version .. Could not obtain server certificate chain
Сандипан Нат
20

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
Lu55
источник
Насколько хорошо это разработано, это должен быть принятый ответ.
Егор Ганс
13
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

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

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

gorums
источник
4
Он используется для проверки сертификата
gorums
2
@gorums Как настроить его в Eclipse?
Малайзи
6
НЕ делайте этого, если вы не хотите рискнуть запустить произвольный вредоносный код на вашем компьютере. Понижено, поскольку это рискует поставить под угрозу любую машину, которая управляет этим.
Брайан
1
То, что это «работает», не означает, что это безопасно, вы подвергаете риску всех, кто следует этому совету. Имейте мое пониженное голосование
Paradoxis
1
@AceKing Дело в том, что это не доверенный код, если вы не проверяете сертификат. Тем не менее, я думаю, что это все еще полезный ответ. Люди, занимающиеся этим, просто должны понимать риски.
Майкл Миор
12

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

MF
источник
Я напрямую импортировал нужные мне сертификаты в JRE / lib / security / cacerts, используя keytool, но это ничего не изменило для меня :( все еще получая ту же ошибку, я также добавил их через IDE или даже в classpath и добавил Bean-объект в укажите местоположение хранилища ключей! Это безумный AF!
Алекс
8

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

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

Ошибка :

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.
Барани р
источник
Привет, я выполнил все шаги, но не повезло :(
ManishNegi
у вас есть какой-либо другой сертификат в пути, кроме cacerts? если у вас есть какой-то другой, попробуйте добавить его к этому сертификату
Barani r
Спасибо @Barani r, это была моя ошибка, я выполнял команду из jre и использовал JDK в своем затмении
ManishNegi
Не удалось загрузить сертификат, но после «запуска от имени администратора» работал хорошо.
Другой кодер
8

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

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

Снеха Шейвал
источник
Спасибо, мужик! Это спасло мой день. Это было единственное подходящее решение в моем случае.
Эндрю Ганс
Спас мой день тоже. Спасибо.
Крис
6

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

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

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

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

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

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

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

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

Reid
источник
Вы великолепны. Спасибо! У меня была проблема с новой сборкой моего Java-сервера, потому что я забыл удалить # перед SSLCertificateChainFile !!! Действительно хорошо объяснил.
KisnardOnline
6

Причина, по которой мы получаем вышеупомянутую ошибку, заключается в том, что 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}}

например

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

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

Абхишек Галода
источник
4

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

Импорт, чтобы jssecacertsработал наконец.

alk453
источник
2
Недостающее объяснение здесь состоит в том, что Java будет использовать, jssecacertsесли присутствует, в противном случае cacerts.
Маркиз Лорн
3

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

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

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

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

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

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

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

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

Викаш Кумар
источник
2

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

royfripple
источник
3
Вы уверены, что отвечаете на правильный вопрос? В первоначальном вопросе нет упоминания о
Done Data Solutions
Я чувствую, что я есть. Я получил ту же ошибку SunCertPathBuilderException и во время поиска решения нашел этот вопрос, а также этот . Однако ни у одного из них не было подходящего решения для моей ситуации. Я не пытался ответить на конкретный вопрос о том, как добавить сайт плагина Cucumber-Eclipse к затмению. Я хотел предоставить контекст для проблемы, с которой я столкнулся (перенаправление URL) и объяснить, как она была решена.
Royfripple
Я обновил свой ответ, чтобы было ясно, что я получил ту же ошибку, отмечая, что основная проблема и решение были разными. Я считаю, что это действительно так, поскольку другие могут найти этот вопрос при поиске по той же ошибке. Пожалуйста, подумайте об изменении своего голоса, если считаете, что это имеет смысл.
Royfripple
Спасибо. Делает вещи намного яснее, отменил мое отрицательное мнение
Done Data Solutions
Пожалуйста! И спасибо, что нашли время, чтобы пересмотреть это снова.
Royfripple
2

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

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

Анкур джайн
источник
1

Я решил эту проблему на 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 pasword, по умолчанию "changeit")
2. введите пароль хранилища ключей источника (пароль pkcs12)


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

ognjenkl
источник
1
Я использовал этот подход на Mac, и он просто работал. Мой сертификат был, конечно, самоподписан и сгенерирован, чтобы я импортировал файл .pfx, сгенерированный на моем сервере windows adfs. Использование Java 10 для моего приложения Спасибо
Шашикант Сони
0

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

Кетан
источник
Можете ли вы сказать мне точную конфигурацию, где я могу установить сертификат. На самом деле у меня возникла проблема, связанная с этим, я установил сертификат относительно этой проблемы с помощью keytool , это работает около 20-30 минут, а затем сервер снова выдает ту же ошибку. Пожалуйста, помогите мне. Я застрял в этом выпуске на 2 дня.
Дипак Гангор
Я думаю, что сертификат меняется каждые 20-30 минут
Vishwanath gowda k
Я сталкиваюсь с подобной проблемой, но проблема в следующем: МОЙ java выбор местоположения по умолчанию для $ JAVA_HOME / lib / security / cacerts приложений Java, хотя я предоставил -Djavax.net.ssl.trustStore = / myapp / app.jks Может ли кто-нибудь мне помочь на это: stackoverflow.com/questions/33821785/…
Laxman G
0

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

Atihska
источник
та же проблема происходит в затмении, даже после закрытия всех приложений
arvindwill
0

цели:

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

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

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

Файл оболочки моего 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);

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

град
источник
1
Это двойное неправильное использование available()специально предупреждено в его собственном Javadoc.
маркиз Лорн
0

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

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

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

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

Если у вас есть выше ошибка с 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 '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.

Кароль Муравски
источник
0

Если 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>
ROMANIA_engineer
источник
0

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

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

jasonoriordan
источник
0

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

Умный кодер
источник
0

Если ваш хост находится за брандмауэром / прокси , используйте следующую команду в 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
Аникет Варей
источник
0

Попробуйте скопировать Java Cacerts:

cp /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.172-9.b11.fc28.x86_64/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts

Лукас Мендес Мота да Фонсека
источник
0

Если вы видите эту проблему в контейнере Linux, когда приложение Java пытается связаться с другим приложением / сайтом, это происходит из-за того, что сертификат был неправильно импортирован в балансировщик нагрузки. Существует последовательность шагов, которые необходимо выполнить для импорта сертификатов, и если вы все сделаете неправильно, вы увидите такие проблемы, как

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

Как только сертификаты импортированы правильно, это должно быть сделано. Нет необходимости возиться с какими-либо сертификатами JDK.

vsingh
источник
0

Я решил это для Intellij. Идея. Я столкнулся с этой проблемой. Я часто меняю место решения проблемы. Я нашел решение для меня. Щелкните правой кнопкой мыши на своем проекте, вы увидите Maven , после этого нажмите « Создать источники и обновить папки и повторно импортировать». введите описание изображения здесь

Сделано.

java.nazif
источник
0

Я столкнулся с той же проблемой, я использовал 8.1.0-3, но позже я использовал 9.2.1-0, и проблема была решена без каких-либо ручных шагов. Самозаверяющий сертификат работал нормально.

Даршил Шах
источник