SSL фатальная ошибка [дубликат]

  egrep -o '^ [^:] *:'  
226
задан JSK NS 16 January 2015 в 13:36
поделиться

21 ответ

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

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

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

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

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

262
ответ дан Matthew Graves 16 August 2018 в 03:35
поделиться
  • 1
    Мне пришлось поместить путь в кавычки, а также сохранить его как Base64 вместо DER – Theodore K. 2 November 2016 в 14:53
  • 2
    wow..и работали как волшебство, так как в chrome вы просто нажимаете значок блокировки на левой адресной строке, а затем нажимаете details , а также нет необходимости перезапуска – aswzen 10 November 2016 в 06:21
  • 3
    В Mac OS X 10.11, jdk8, перезапуск не нужен. – malajisi 20 March 2017 в 10:55
  • 4
    поскольку java не является демоном и работает по требованию, как перезапустить jvm? – Sudip Bhandari 25 July 2017 в 09:19
  • 5
    Обратите внимание, что инструкции должны повторяться для всех сертификатов в цепочке. Также имя сертификата alias в командной строке должно быть уникальным. – Lu55 12 September 2017 в 18:50

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

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

2
ответ дан alk453 16 August 2018 в 03:35
поделиться
  • 1
    Недостающее объяснение здесь заключается в том, что Java будет использовать jssecacerts, если он присутствует, в противном случае cacerts. – user207421 27 June 2018 в 03:31

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

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

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

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 folder

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

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

С уважением,

Ankur

0
ответ дан Ankur jain 16 August 2018 в 03:35
поделиться

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

0
ответ дан Atihska 16 August 2018 в 03:35
поделиться
  • 1
    такая же проблема происходит в затмении, даже после закрытия всего приложения – arvindwill 5 August 2016 в 08:07

Проблема:

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

Ошибка:

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 имел ненадежный сертификат .)
  • Загрузите сертификат по клик по ошибке сертификата -> просмотреть сертификат
  • вкладка «Выбрать детали» -> копировать в файл -> следующий -> выбрать «закодированный DER двоичный файл X.509 (.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 / shel don / desktop / product.cer "-alias product -keystore" C: / Program Files / Java / jdk1.8.0_141 / jre / lib / security / cacerts ".

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

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

keytool -importcert -file "C:/Users/sheldon/Desktop/product.cer" -alias product -keystore "C:/Program iles/Java/jdk1.8.0_141/jre/lib/security/cacerts"
Enter keystore password:
Trust this certificate? [no]:  yes
Certificate was added to keystore
  • Согласие! теперь вы должны были избавиться от ошибки «Не удалось создать PKIX-путь: ошибка sun.security.provider.certpath.SunCertPathBuilderException» в вашей среде IDE NetBeans.
4
ответ дан Barani r 16 August 2018 в 03:35
поделиться
  • 1
    Привет, я следил за всеми шагами, но не повезло :( – ManishNegi 6 May 2018 в 04:00
  • 2
    есть ли у вас другой сертификат на пути, отличном от cacerts? если у вас есть другие, попробуйте добавить его в этот сертификат – Barani r 7 May 2018 в 05:58
  • 3
    Спасибо @Barani r. Это была моя ошибка. Я выполнял команду от jre и использовал JDK в своем затмении – ManishNegi 8 May 2018 в 05:01

Я хотел импортировать сертификат для 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 "-file C: \ Users \ Admin \ Desktop \ gmail.cer
  3. Введите пароль chageit
  4. Нажмите« Да », чтобы импортировать сертификат
  5. Перезапустить java

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

6
ответ дан dazito 16 August 2018 в 03:35
поделиться
  • 1
    Спасибо, мужик! Это спасло мой день. Это было единственное подходящее решение в моем случае. – Andrew Gans 25 February 2017 в 14:31

целей:

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

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

  1. определить собственное хранилище ключей
  2. My Keystore

  3. redefine SSL default context с нашим пользовательским классом
  4. ???
  5. profit

wrapper file:

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

Этот класс сделан как singleton, потому что разрешен только один контекст 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
ответ дан degr 16 August 2018 в 03:35
поделиться
  • 1
    Это двойное злоупотребление available() специально предупреждается в своем собственном Javadoc. – user207421 27 June 2018 в 03:32

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

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

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

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

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

Надеюсь, это сэкономит время на обострение.

63
ответ дан Jeremy Goodell 16 August 2018 в 03:35
поделиться
  • 1
    Я пытаюсь получить доступ к серверу ssl с самозаверяющим сертификатом, попробовал добавить его сертификат с помощью keytool, но не повезло, никаких предложений? – Oleg Belousov 3 March 2014 в 19:10
  • 2
    Рад, что это сработало. Но знаете ли вы, в чем была главная причина. что заставило его потерпеть неудачу с сертификатами java 6 и каким образом сертификаты java 7 исправили проблему – Vishwanath gowda k 29 October 2014 в 08:01
  • 3
    Это произошло, хотя я перешел от icedtea 1.6 к оракулу 1.7. :) – progo 15 November 2014 в 14:42
  • 4
    Также рассмотрите это решение: stackoverflow.com/questions/33439905/… – Piohen 12 April 2016 в 14:37
  • 5
    Для тех, кто любит меня, иногда пропускает очевидное - убедитесь, что вы входите в $JAVA_HOME/jre/lib, а не $JAVA_HOME/lib - я потратил немного времени на то, чтобы не допустить этой детали. – Ryan Heathcote 14 July 2016 в 16:47

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

0
ответ дан ketan 16 August 2018 в 03:35
поделиться
  • 1
    Не могли бы вы рассказать мне точную конфигурацию, где я могу установить сертификат. У меня есть проблема с этим, я установил сертификат по этой проблеме с помощью keytool , это работает примерно 20-30 минут, а затем сервер снова выдает такую ​​же ошибку. Пожалуйста, помогите мне. Я застрял в этом вопросе в течение 2 дней. – Deepak Gangore 21 January 2014 в 20:26
  • 2
    Я думаю, что сертификат меняется каждые 20-30 минут – Vishwanath gowda k 29 October 2014 в 07:28
  • 3
    Я сталкиваюсь с аналогичной проблемой, но проблема заключается в следующем: MY java выбирает местоположение по умолчанию для $ JAVA_HOME / lib / security / cacerts приложений Java, хотя я поставил -Djavax.net.ssl.trustStore = / myapp / app.jks Может ли кто-нибудь мне помочь на этом: stackoverflow.com/questions/33821785/… – Laxman G 20 November 2015 в 16:31
[Д2] 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
5
ответ дан Lu55 16 August 2018 в 03:35
поделиться

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

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

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

10
ответ дан M. F. 16 August 2018 в 03:35
поделиться
  • 1
    Я напрямую импортировал сертификаты, которые мне нужны в JRE / lib / security / cacerts, используя keytool, но ничего не изменил для меня :( все еще получая ту же ошибку, я также добавил их через среду IDE или даже в путь к классам и добавил Bean to укажите местоположение хранилища ключей! Это безумие AF! – Alex 31 March 2017 в 08:47

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

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

CMD-Line:

  1. keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts
  2. введите PW: changeit (может быть изменено на Mac )
15
ответ дан Mike Mitterer 16 August 2018 в 03:35
поделиться
  • 1
    На mac, с CMD-Line, следует использовать sudo для запуска команды. # sudo keytool -importcert -file jetty.crt -alias jetty -keystore $ JAVA_HOME / jre / lib / security / cacerts – malajisi 20 March 2017 в 10:56
  • 2
    В Windows команда, которая работает: keytool -importcert -file dinardap_cert.cer –alias dinardap –keystore “%JAVA_HOME%/jre/lib/security/cacerts” – Patricio Bonilla 26 July 2017 в 20:13
  • 3
    где получить файл сертификата? Я не могу указать, к какому URL идти. jetty.com ? – kraftydevil 5 September 2017 в 02:13

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

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

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

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

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

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

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

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

2
ответ дан Reid 16 August 2018 в 03:35
поделиться

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

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

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

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

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

Однако при навигации по нему через браузер он перенаправляется (обратите внимание на добавленный «.github»):

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

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

2
ответ дан royfripple 16 August 2018 в 03:35
поделиться
  • 1
    Вы уверены, что отвечаете на правильный вопрос? В исходном вопросе нет упоминания огурца ... – rrschmidt 1 May 2017 в 21:57
  • 2
    Я чувствую, что я. Я получил ту же ошибку SunCertPathBuilderException и при поиске разрешения нашел этот вопрос, а этот . Однако ни у кого из них не было подходящего решения для моей ситуации. Я не пытался ответить на конкретный вопрос о том, как добавить сайт плагина Cucumber-Eclipse для затмения. Я хотел предоставить контекст для проблемы, с которой я столкнулся (перенаправление URL), и объяснить, как это было разрешено. – royfripple 3 May 2017 в 03:23
  • 3
    Я обновил свой ответ, чтобы было ясно, что я получил ту же ошибку, отметив, что основная проблема и решение были разными. Я считаю, что это действительно так, поскольку другие могут найти этот вопрос при поиске по той же ошибке. Пожалуйста, подумайте о том, чтобы изменить свой голос, если вы считаете, что это имеет смысл. – royfripple 3 May 2017 в 03:37
  • 4
    Спасибо. Делает вещи намного яснее, меняет направление вниз – rrschmidt 3 May 2017 в 07:44
  • 5
    Пожалуйста! И спасибо, что потратили время на повторное рассмотрение. – royfripple 6 May 2017 в 04:35

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    private static class SavingTrustManager implements X509TrustManager {

        private final X509TrustManager tm;
        private X509Certificate[] chain;

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

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

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

        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            this.chain = chain;
            tm.checkServerTrusted(chain, authType);
        }
    }
}
23
ответ дан Shashank Agrawal 16 August 2018 в 03:35
поделиться
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true

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

4
ответ дан SkyWalker 16 August 2018 в 03:35
поделиться
  • 1
    Он используется для перехода к проверке сертификата – gorums 6 April 2016 в 23:13
  • 2
    Он игнорирует безопасность. Это не хорошая практика. – tedder42 21 December 2016 в 06:41
  • 3
    Это ЧРЕЗВЫЧАЙНО небезопасно и не следует судить. – BrianC 13 March 2017 в 17:14
  • 4
    @gorums Как настроить его в Eclipse? – malajisi 20 March 2017 в 09:09
  • 5
    НЕ делайте этого, если вы не хотите рисковать запуском на вашем компьютере произвольного вредоносного кода. Downvoted, поскольку он рискует поставить под угрозу любую машину, которая ее запускает. – Bryan 12 October 2017 в 18:20

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

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

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

С уважением.

0
ответ дан user1379218 16 August 2018 в 03:35
поделиться
0
ответ дан Karol Murawski 6 September 2018 в 02:29
поделиться
0
ответ дан Abhishek Galoda 29 October 2018 в 09:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: