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

У меня есть клиент Java, пытающийся получить доступ к серверу с самозаверяющим сертификатом.

Когда я пытаюсь отправить сообщение на сервер, я получаю следующую ошибку:

не удалось найти допустимый путь сертификации для запрошенной цели

Проведя некоторое исследование по этому вопросу, я сделал следующее.

  1. Сохранено имя моего сервера как файл root.cer.
  2. В моей JRE сервера Glassfish я запускал это: keytool -import -alias example -keystore cacerts -file root.cer.
  3. Чтобы проверить, что сертификат был добавлен в мой cacert успешно, я сделал это: keytool -list -v -keystore cacerts. Я вижу, что сертификат присутствует.
  4. Затем я перезапустил Glassfish и ушел в отставку.

Я все еще получаю ту же ошибку.

У меня такое чувство, потому что моя Glassfish на самом деле не читает файл cacert, который я исправил, но, возможно, еще один.

У кого-нибудь из вас была эта проблема и может подтолкнуть меня в правильном направлении?

К сожалению, это может быть много, и множество серверов приложений и других оболочек java склонны играть со свойствами, а их «собственные» используют брелки, а что нет. Поэтому он может смотреть на нечто совершенно другое.

Если не считать фермы, я бы попробовал:

java -Djavax.net.debug=all -Djavax.net.ssl.trustStore=trustStore ... 

чтобы узнать, помогает ли это. Вместо «всего» можно также установить его в «ssl», менеджер ключей и менеджер доверия, что может помочь в вашем случае. При настройке на «help» на большинстве платформ будет указано что-то вроде ниже.

Независимо – убедитесь, что вы полностью понимаете разницу между хранилищем ключей (в котором у вас есть закрытый ключ и сертификат, подтверждающий вашу личность) и хранилищем доверия (которое определяет, кому вы доверяете), – и тот факт, что ваша собственная личность также имеет «цепочку» доверия к корню – который отделен от любой цепи до корня, который вам нужно выяснить, «кто» вы доверяете.

 all turn on all debugging ssl turn on ssl debugging The following can be used with ssl: record enable per-record tracing handshake print each handshake message keygen print key generation data session print session activity defaultctx print default SSL initialization sslctx print SSLContext tracing sessioncache print session cache tracing keymanager print key manager tracing trustmanager print trust manager tracing pluggability print pluggability tracing handshake debugging can be widened with: data hex dump of each handshake message verbose verbose handshake message printing record debugging can be widened with: plaintext hex dump of record plaintext packet print raw SSL/TLS packets 

Источник: # См. http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug

Вот решение, следуйте приведенной ниже ссылке. Шаг за шагом:

http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/

JAVA FILE: отсутствует в блоге

 /* * 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. */ import java.io.*; import java.net.URL; import java.security.*; import java.security.cert.*; import javax.net.ssl.*; 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); } } } 

Вам необходимо настроить свойства системы JSSE, в частности указать хранилище сертификатов клиента.

Через командную строку:

 java -Djavax.net.ssl.trustStore=truststores/client.ts com.progress.Client 

или через Java-код:

 import java.util.Properties; ... Properties systemProps = System.getProperties(); systemProps.put("javax.net.ssl.keyStorePassword","passwordForKeystore"); systemProps.put("javax.net.ssl.keyStore","pathToKeystore.ks"); systemProps.put("javax.net.ssl.trustStore", "pathToTruststore.ts"); systemProps.put("javax.net.ssl.trustStorePassword","passwordForTrustStore"); System.setProperties(systemProps); ... 

Подробнее см. Подробности на сайте RedHat .

У меня была такая же проблема с sbt .
Он пытался получить зависимости от repo1.maven.org через ssl
но сказал, что «не удалось найти допустимый путь сертификации к запрашиваемому URL-адресу».
поэтому я следил за этим сообщением и до сих пор не смог проверить соединение.
Поэтому я прочитал об этом и обнаружил, что корневого сертификата недостаточно, как было предложено постом, так что –
то, что работало для меня, было импортирование промежуточных сертификатов CA в хранилище ключей .
Я фактически добавил все сертификаты в цепочку, и это сработало как шарм.

(повторение от моего другого ответа )
Используйте утилиту cli utility keytool из дистрибутива Java для импорта (и доверия! ) Необходимых сертификатов

Образец:

  1. Из файла cli change dir to jre \ bin

  2. Проверить хранилище ключей (файл найден в каталоге jre \ bin)
    keytool -list -keystore .. \ lib \ security \ cacerts
    Пароль изменен

  3. Загрузите и сохраните все сертификаты в цепочке с нужного сервера.

  4. Добавить сертификаты (перед тем, как удалить атрибут «только для чтения» в файле «.. \ lib \ security \ cacerts»), запустите: keytool -alias REPLACE_TO_ANY_UNIQ_NAME -import -keystore .. \ lib \ security \ cacerts -file “r: \ root.crt»

случайно я нашел такой простой наконечник. Другие решения требуют использования InstallCert.Java и JDK

источник: http://www.java-samples.com/showtutorial.php?tutorialid=210

Моя проблема заключалась в том, что на моем рабочем ноутбуке с помощью обновления программного обеспечения был установлен брокер безопасности доступа к облакам, NetSkope. Это изменило цепочку сертификатов, и я все еще не смог подключиться к серверу через мой java-клиент после импорта всей цепочки в хранилище ключей cacerts. Я отключил NetSkope и смог успешно подключиться.

Я работаю над учебным пособием для веб-служб REST на http://www.udemy.com (REST Java Web Services). В примере в учебнике сказано, что для того, чтобы иметь SSL, у нас должна быть папка «trust_store» в моем «клиенте» проекта eclipse, которая должна содержать файл «хранилище ключей» (у нас был «клиентский» проект для вызова службы и «сервис», в котором содержится веб-служба REST – 2 проекта в одной рабочей области затмения, одна – клиент, другая – служба). Чтобы все было просто, они сказали, чтобы скопировать «keystore.jks» с сервера приложений Glassfish (glassfish \ domains \ domain1 \ config \ keystore.jsk), который мы используем и помещаем в эту папку «trust_store», которую они заставили меня сделать клиентский проект. Это, по-видимому, имеет смысл: самозаверяющие сертификаты в key_store сервера будут соответствовать сертификатам в trust_store клиента. Теперь, делая это, я получал ошибку, о которой упоминается в оригинальной записи. Я искал это и прочитал, что ошибка связана с файлом «keystore.jks» на клиенте, который не содержит доверенный / подписанный сертификат, что полученный сертификат является самоподписанным.

Чтобы все было ясно, позвольте мне сказать, что, как я понимаю, «keystore.jsk» содержит самозаверяющие сертификаты, а файл «cacerts.jks» содержит сертификаты CA (подписанные CA). «Keystore.jks» – это «хранилище ключей», а «cacerts.jks» – «магазин доверия». Как отмечает комментатор «Бруно», «keystore.jks» является локальным, а «cacerts.jks» – для удаленных клиентов.

Итак, я сказал себе, эй, у стеклянной рыбы также есть файл «cacerts.jks», который является файлом trust_store из стеклянной рыбы. Предполагается, что cacerts.jsk должен содержать сертификаты CA. И, видимо, мне нужна папка trust_store для хранения файла хранилища ключей, в котором есть хотя бы один сертификат CA. Итак, я попытался поместить файл «cacerts.jks» в папку «trust_store», которую я сделал, в моем проекте клиента, и изменить свойства виртуальной машины, чтобы указать на «cacerts.jks» вместо «keystore.jks». Это избавило от ошибки. Я предполагаю, что все, что ему нужно, – это сертификат CA.

Это может быть не идеально для производства или даже для развития, кроме как только что-то работать. Например, вы могли бы использовать команду «keytool» для добавления сертификатов CA в файл «keystore.jks» на клиенте. Но, надеюсь, это, по крайней мере, сужает возможные сценарии, которые могут произойти здесь, чтобы вызвать ошибку.

ТАКЖЕ: мой подход, по-видимому, был полезен для клиента (серверный сертификат добавлен в клиентский trust_store), похоже, что комментарии, описанные выше для устранения исходного сообщения, полезны для сервера (клиентский сертификат добавлен на сервер trust_store). Приветствия.

Настройка проекта Eclipse:

  • MyClientProject
  • ЦСИ
  • контрольная работа
  • Системная библиотека JRE
  • trust_store
    — cacerts.jks — keystore.jks

Фрагмент из файла MyClientProject.java:

 static { // Setup the trustStore location and password System.setProperty("javax.net.ssl.trustStore","trust_store/cacerts.jks"); // comment out below line System.setProperty("javax.net.ssl.trustStore","trust_store/keystore.jks"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); //System.setProperty("javax.net.debug", "all"); // for localhost testing only javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() { public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) { return hostname.equals("localhost"); } }); } 

Допустим, если вы используете переменные classpath, такие как $ {JAVA_HOME} в pom.xml.

                 

По целям добавьте переменные classpath. т.е. .., -DANT_HOME, -DJAVA_HOME

 clean install -e -DPROJECT_HOME=..... -DANT_HOME=C:\bea1036\modules\org.apache.ant_1.7.1 -DJAVA_HOME=C:\bea1036\jdk160_31 
  • C # Игнорировать ошибки сертификата?
  • Сертификату SSL не доверяют - только на мобильных телефонах
  • SSL и непонимание вручную
  • Thunderbird: Ошибка: imap.server.com: сервер не поддерживает RFC 5746, см. CVE-2009-3555
  • SSLHandshakeException: нет альтернативных имен объектов
  • Отключить SSLv3 в основных браузерах
  • Почему некоторые веб-сайты отображают название компании рядом с URL-адресом?
  • Как я могу использовать разные сертификаты для определенных соединений?
  • Facebook JavaScript SDK через HTTPS, загрузка незащищенных элементов
  • Не удалось установить доверительные отношения для безопасного канала SSL / TLS - SOAP
  • Самостоятельный SSL-сертификат Tomcat Server / Client
  • Давайте будем гением компьютера.