"Помилка побудови шляху PKIX" та "не вдалося знайти дійсний шлях сертифікації до потрібної цілі"


422

Я намагаюся отримати твіти, використовуючи бібліотеку twitter4j для свого проекту java. Під час мого першого запуску я отримав помилку щодо сертифіката sun.security.validator.ValidatorExceptionта sun.security.provider.certpath.SunCertPathBuilderException. Потім я додав сертифікат Twitter:

C:\Program Files\Java\jdk1.7.0_45\jre\lib\security>keytool -importcert -trustcacerts -file PathToCert -alias ca_alias -keystore "C:\Program Files\Java\jdk1.7.0_45\jre\lib\security\cacerts"

Але без успіху. Ось процедура отримання твітів:

public static void main(String[] args) throws TwitterException {
    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true)
        .setOAuthConsumerKey("myConsumerKey")
        .setOAuthConsumerSecret("myConsumerSecret")
        .setOAuthAccessToken("myAccessToken")
        .setOAuthAccessTokenSecret("myAccessTokenSecret");

    TwitterFactory tf = new TwitterFactory(cb.build());
    Twitter twitter = tf.getInstance();

    try {
        Query query = new Query("iphone");
        QueryResult result;
        result = twitter.search(query);
        System.out.println("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

6
Привіт Перевірте нижче URL-адресу. Я впевнений, що вони допоможуть вам. java-samples.com/showtutorial.php?tutorialid=210 confluence.atlassian.com/display/JIRAKB/… . Ви повинні додати свій сертифікат ssl в сертифікат java truststore (Шлях: jre / lib / security / cacerts).
sus007

Будь ласка, зверніться до цієї відповіді для вирішення плюс підтвердьте, що ви упаковуєте програмне забезпечення у вигляді пакету jre? якщо так, то скопіюйте файлову систему файлів cacerts та замініть цей запакований файл jre cacerts.
positivecrux

спробуйте це stackoverflow.com/a/9210661/4741746, можливо, це ваша відповідь
sushant gosavi

2
Я просто використав цей Java-код, і для https не забудьте вказати порт як 443. Код Java на github.com/escline/InstallCert/blob/master/InstallCert.java він займе ваш файл CACERTS і додасть усі ці плюси поточний сертифікат для URL-адреси, яку ви вводите як вхід. У моєму випадку я жорстко кодував значення host = "mywebservice.uat.xyz.com"; порт = 443; passphrase = "changeit" .toCharArray (); Потім програма створює новий файл під назвою "jssecacerts", у якому буде все. Перейменуйте це на "cacerts" і скористайтеся цим. Ви все будете налаштовані.
Reddymails

Відповіді:


572
  1. Перейдіть до URL-адреси у своєму браузері:
    • firefox - натисніть на ланцюжок сертифікатів HTTPS (піктограма блокування поруч із URL-адресою). Клацніть "more info" > "security" > "show certificate" > "details" > "export..". Підберіть ім'я та оберіть тип файлу example.cer
    • chrome - натисніть на піктограму сайту ліворуч для адреси в адресному рядку, виберіть "Сертифікат" -> "Деталі" -> "Експорт" і збережіть у форматі "Бінарний кодований двійковий код, єдиний сертифікат".
  2. Тепер у вас є файл із зберіганням ключів, і ви повинні додати його до свого JVM. Визначте розташування файлів кесерів, наприклад. C:\Program Files (x86)\Java\jre1.6.0_22\lib\security\cacerts.

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

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


27
Мені довелося поставити шлях у лапки, а також зберегти його як Base64 замість DER
Теодор К.

3
wow..its працював як магія, до речі, в хромі, ви просто натискаєте значок блокування в лівій адресному рядку, а потім натискаєте деталі плюс не потрібно перезавантаження
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

Після багатьох годин, намагаючись створити файли cert, щоб моя установка Java 6 працювала з новою версією twitter, я нарешті натрапив на неймовірно просте рішення, поховане в коментарі на одній із дощок повідомлень. Просто скопіюйте файл кекерів із установки Java 7 та перезапишіть файл у вашій установці Java 6. Напевно, найкраще спершу зробити резервну копію файлу cacerts, але потім просто скопіюйте нове в і BOOM! це просто працює.

Зауважте, що я фактично скопіював файл кесерів Windows на інсталяцію Linux, і він працював чудово.

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

Сподіваюсь, це заощадить чужі години загострення.


4
Я намагаюся отримати доступ до сервера ssl із сертифікатом, який підписав самостійно, спробував додати його сертифікат за допомогою keytool, але не пощастило, будь-які пропозиції?
Олег Білоусов

1
Рада, що це працювало .. Але чи знаєте ви, що було першопричиною. що призвело до невдачі з java 6 certs .. і як java 7 certs вирішив проблему
Vishwanath gowda k

Це зробило це, хоча я перейшов від icedtea 1.6 до oracle 1.7. :)
nperson325681

Крім того, розглянути це рішення: stackoverflow.com/questions/33439905 / ...
Piohen

10
Для тих, хто подобається мені, іноді пропускають очевидне - переконайтеся, що ви збираєтеся зайти $JAVA_HOME/jre/lib, ні $JAVA_HOME/lib- я витратив трохи часу, не вистачаючи цієї деталі.
Райан Хіткот

35

МОЙ підхід користувача:

  1. Завантажте провідник keystore тут
  2. Відкрийте $ JAVA_HOME / jre / lib / security / cacerts
  3. введіть PW: changeit (Можна змінити на Mac)
  4. Імпортуйте файл .crt

CMD-лінія:

  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”
Patricio Bonilla

звідки взяти файл cert? Я не можу сказати, до якої 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, то переконайтеся, що ви налаштували Work каталог у 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);
        }
    }
}

2
Зверніть увагу, що створений файл - це jssecacerts!
DeanDP

Я спробував використовувати це рішення для Java 7 та 8. Під час роботи на Java 7 я отримав протокол_версії або рукостискання_файлу для всіх віддалених 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:
    • Файл -> Структура проекту ... -> Налаштування проекту -> Проект -> Пакет 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

Наскільки це добре продумано, це має бути прийнятою відповіддю.
Егор Ганс

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

Він використовується для стрибка перевірки сертифікату.

Попередження Небезпечно використовувати лише для цілей розвитку!


4
Він використовується для стрибка перевірки сертифікату
gorums

2
@gorums Як встановити це в Eclipse?
Маладжисі

6
НЕ робіть цього, якщо ви не хочете ризикувати запуском довільного шкідливого коду на вашій машині. Незважаючи на те, що це ризикує порушити будь-яку машину, яка працює на ній.
Брайан

1
Тільки тому, що це "працює" не означає, що це безпечно, ви ставите під загрозу всіх, хто дотримується цієї поради. Запропонуйте мій результат
Парадокс

1
@AceKing Справа в тому, що йому не довіряють код, якщо ви не підтвердили сертифікат. Однак, я думаю, що це все ще корисна відповідь. Люди, які роблять це, просто потребують розуміння ризиків.
Майкл Міор

12

У мене була дещо інша ситуація, коли і JDK, і JRE 1.8.0_112 були в моїй системі.

Я імпортував нові сертифікати ЦС [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, є: насправді вказується на магазин, що знаходиться в магазині [JRE_FOLDER]\lib\security\cacerts.

У моєму випадку рішенням було скопіювати файл кесерів, використовуваний JDK (до якого були додані нові CA), над тим, який використовував JRE, і це вирішило проблему.


Я безпосередньо імпортував certs, які мені потрібні в JRE / lib / security / cacerts, використовуючи keytool, але це нічого не змінило для мене :( все одно отримую ту саму помилку, я також додав їх через IDE або навіть у classpath і додав Bean в вкажіть місце зберігання брелоків !! Це божевільний АФ!
Алекс,

8

Передумови випуску:

У мене з'явилася наступна помилка, коли я намагаюся запустити mvn clean install у своєму проекті та через Netbeans IDE варіант очищення та створення. Ця проблема пов'язана з тим, що сертифікат недоступний, коли ми завантажуємо через NET-боби IDE / через командний рядок, але можемо завантажувати файли через браузер.

Помилка :

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

Роздільна здатність:

1. Завантажте відповідний сертифікат URL-адреси:

  • Запустіть IE за допомогою "run as adminstrator" (інакше ми не зможемо завантажити сертифікат)
  • Введіть URL в IE-> https: // url / local-repo (У моєму випадку ця URL-адреса мала непідтверджений сертифікат введіть тут опис зображення.)
  • Завантажте сертифікат, натиснувши на Помилка сертифіката -> переглянути сертифікат
  • Виберіть вкладку "Подробиці" -> скопіювати у файл -> далі -> виберіть "Бінарний код X.509, кодований DER" (.CER)
  • збережіть сертифікат у якомусь місці, наприклад: c: /user/sheldon/desktop/product.cer
  • Вітаю! ви успішно завантажили сертифікат для сайту

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 / lib / security / cacerts ".

  • Вам буде запропоновано ввести пароль. Введіть пароль зберігання клавіш: введіть ще раз "змінити" для "Довіряти цьому сертифікату? [Ні]:", введіть "так"

Зразок команд / виводу командного рядка:

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
  • Подяки! тепер вам слід було позбутися помилки "Помилка побудови шляху 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-підключити smtp.gmail.com:265

  1. Скопіюйте та збережіть рядки між "----- НАЧАЙТЕ СЕРТИФІКАТ -----" та "----- ЗАКОНЧИЙ СЕРТИФІКАТ -----" у файл, gmail.cer

  2. Біжи

    keytool -import -alias smtp.gmail.com -keystore "% JAVA_HOME% / jre / lib / security / cacerts" -файл C: \ Користувачі \ Адміністратор \ Настільний \ gmail.cer

  3. Введіть chageit пароля

  4. Клацніть так, щоб імпортувати сертифікат

  5. Перезавантажте Java

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


Спасибі, чоловіче! Це врятувало мені день. Це було єдине відповідне рішення в моєму випадку.
Ендрю Ганс

Врятував і мій день. Дякую.
Кріс

6

Це не відповідь, що стосується Twitter, але це питання, яке виникає при пошуку цієї помилки. Якщо ваша система отримує цю помилку під час підключення до веб-сайту, який, як видається, має дійсний сертифікат під час перегляду у веб-браузері , це, ймовірно, означає, що веб-сайт має неповний ланцюжок сертифікатів .

Короткий підсумок проблеми: Органи сертифікації не використовують свій кореневий сертифікат для підписання будь-якого старого сертифіката. Натомість вони (зазвичай) підписують проміжні сертифікати, на яких також встановлено прапор Органу сертифікації (тобто дозволяється підписувати сертифікати). Потім, купуючи сертифікат у ЦА, вони підписують Вашу КСВ одним із цих проміжних сертифікатів.

У вашому довіреному магазині Java, швидше за все, є лише Root Cert, а не проміжні.

Неправильно налаштований сайт може повернути лише їх підписаний сертифікат. Проблема: він був підписаний з проміжним сертифікатом, якого немає у вашому довірчому магазині. Браузери вирішують цю проблему, завантажуючи або використовуючи кешований проміжний сертифікат; це максимізує сумісність веб-сайтів. Java та такі інструменти, як OpenSSL, не будуть. І це спричинить помилку у питанні.

Ви можете перевірити цю підозру за допомогою тесту SSL Qualys . Якщо ви запускаєте це проти сайту, і він говорить

Ланцюг сертифікатів цього сервера неповний.

то це підтверджує це. Ви також можете побачити це, переглянувши шляхи сертифікації та побачивши текст Завантажити .

Як це виправити: адміністратору сервера необхідно налаштувати веб-сервер і для повернення проміжних сертифікатів. Наприклад, для Comodo, ось цей .ca-bundleфайл стане в нагоді. Наприклад, у конфігурації Apache з mod_ssl ви використовували б SSLCertificateChainFileналаштування конфігурації. Для nginx вам потрібно об'єднати проміжні сертифікати та підписаний сертифікат і використовувати це в конфігурації cert SSL. Більше можна знайти, шукаючи в мережі "неповний ланцюжок сертифікатів".


Ти геніальний. Дякую! У мене виникла проблема з новою збіркою мого сервера Java, оскільки я забув видалити # перед SSLCertificateChainFile !!! Дійсно добре пояснено.
KisnardOnline

6

Причина, з якої ми отримуємо вище помилку, полягає в тому, що JDK в комплекті з великою кількістю довірених сертифікатів Органу сертифікатів (CA) у файл, який називається "cacerts", але цей файл не має поняття в нашому самопідписаному сертифікаті. Іншими словами, у файлі cacerts не імпортований наш самопідписаний сертифікат, і, таким чином, він не трактує його як довірену особу, і, отже, він дає вищевказану помилку.

Як виправити вищевказану помилку

Щоб виправити вищевказану помилку, все, що нам потрібно, - це імпортувати самопідписаний сертифікат у файл cacerts.

Спочатку знайдіть файл кесерів. Нам потрібно буде з’ясувати місце JDK. Якщо ви запускаєте свою програму через один із IDE, таких як Eclipse або IntelliJ Idea, перейдіть до налаштувань проекту та з’ясуйте, що таке JDK. Наприклад, для Mac OS типовим розташуванням файлу кесерів буде в цьому місці / Бібліотека / Java / JavaVirtualMachines / {{JDK_version}} / Зміст / Головна / jre / lib / безпека на машині Windows, це буде під {{Installation_directory} } / {{JDK_version}} / jre / lib / безпека

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

Якщо у вас немає файлу сертифікату (.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працював нарешті.


2
Відсутнє пояснення тут полягає в тому, що Java використовуватиме, jssecacertsякщо є, інакше cacerts.
Маркіз Лорн

3

Це рішення, але у формі моєї історії з цією проблемою:

Я майже мертвий, пробуючи все рішення, подане вище (протягом 3 днів), і мені нічого не вийшло.

Я втратив усяку надію.

Я зв’язався з моєю службою безпеки з цього приводу, тому що я стояв за проксі-сервером, і вони сказали, що нещодавно оновили свою політику безпеки.

Я погано лаяв їх за те, що не повідомив розробників.

Пізніше вони видали новий файл "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-адреси сайту оновлення при додаванні сайту оновлення в затемнення.


3
Ви впевнені, що відповідаєте на правильне запитання? У первісному запитанні огірок не згадується ...
Зроблено 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, імпортуючи cert з pkcs12магазину в cacertsсховище ключів.

Шлях до магазину pkcs12:
C:\Apps\pkcs12.pfx

Шлях до касети Java:
C:\Program Files\Java\jre1.8.0_151\lib\security\cacerts

Шлях до keytool:
C:\Program Files\Java\jre1.8.0_151\bin

Після можливості папки з keytool у командному рядку (як адміністратор), команда імпортувати cert з 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).


1
Я використовував цей підхід на Mac, і він просто працював. Мій Серт, звичайно, був самостійно підписаний і згенерований, щоб я імпортував файл .pfx, який я створив на моєму сервері Windows adfs. Використання Java 10 для мого додатка Спасибі
Shashikant Soni

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

Для мене виникла помилка сертифіката, оскільки у мене у фоновому режимі запущений скрипт, і це переплутано з сертифікатом. Він виконує функцію проксі-сервера настільки близький, що і перезапустить затемнення.



0

цілі:

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

Цей клас зроблено як одиночний, оскільки дозволений лише один контекст SSL за замовчуванням. Отже, зараз використання:

            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 місце розташування за замовчуванням встановлено програмними файлами, і ви отримаєте помилка через пробіл між файлами програми.

0

Я виправив це за допомогою методу нижче

  1. Скопіюйте URL-адресу, що має проблеми з підключенням
  2. Перейдіть до Android Studio-> Settings-> Http settings
  3. У поле "Тест з'єднання" вставте URL-адресу та натисніть кнопку ОК
  4. Натиснувши Ок, Android Studio попросить імпортувати сертифікат цієї URL-адреси, імпортувати його
  5. Це воно. Більше нічого не можна було зробити, і мого питання вже не було. Не потрібно також перезавантажувати студію.

0

Якщо у вас є вище помилка з програмним забезпеченням атласа, наприклад. джира

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

Ви можете додати certs до надійного сховища ключів (змінити відсутні_ca на власне ім'я cert):

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

Якщо вас запитують, поставте changeitі підтвердьте парольy

Після цього просто перезапустіть джиру.


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>

0

Я використовував власний магазин довіри, а не JRE, передаючи arg -Djavax.net.ssl.trustStore=

Я отримував цю помилку незалежно від certs у truststore. Питання для мене полягало в упорядкуванні властивостей, переданих на аргумент. Коли я поставив -Djavax.net.ssl.trustStore=& -Djavax.net.ssl.trustStorePassword= before -Dspring.config.location= & -jarargs, я зміг успішно викликати спокійний дзвінок через https.


0

Якщо ви використовуєте CloudFoundry і стикаєтеся з видачею сертифікатів, вам доведеться переконатись, що ви знову натискаєте банку за допомогою служби зберігання ключів із сертифікатом. Просто скасувати, зв’язати та перезапустити не буде працювати.


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

Якщо ви бачите цю проблему в контейнері 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.


0

Я вирішив це для Intellij Idea. Я зіткнувся з цією проблемою Althouh, я змінив багато місця, щоб вирішити проблему. Я знайшов рішення для мене. Клацніть на вашому проекті, ви побачите Maven , після цього натисніть " Генерувати джерела та оновити папки та ReImport" введіть тут опис зображення

Це робиться.


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.