Сбой построения пути PKIX: невозможно найти действительный путь сертификации к запрошенной цели - импортирован CERT - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь использовать запрос get на сайте с REST API.Однако ссылка для доступа это IP-адрес, и я получаю:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели

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

Как я могу решить эту проблему?

Ниже приведен мой код:

public static void main(String[] args) {

    System.getProperties().put( "proxySet", "true" );
    System.getProperties().put( "socksProxyHost", "xxx.xxx.xxx.xxx" );
    System.getProperties().put( "socksProxyPort", "xxxx" );


    URL requestLink = ismTicketManager.UrlEncode.convertToURLEscapingIllegalCharacters("https://xx.xx.xx.xx/e/528f5016-6fd9-403f-85e4-5a54bb2498b9/api/v1/problem/feed?relativeTime=30mins&Api-Token=xxxxx");

    try {
        HttpURLConnection targetConn = (HttpURLConnection)requestLink.openConnection();
        targetConn.setRequestMethod("GET");
        System.out.println(targetConn.getResponseCode());
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("Connection failed");
    }

    static {
    HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals("127.0.0.1"));
}

}

Я экспортировал сертификат из Firefox и импортировал его в файл cacerts: Список файлов cacerts выглядит следующим образом:

restapi, 25-Sep-2018,rustCertEntry, отпечаток сертификата (SHA1): AB: 6D: C6: 2E: 9F: B3: D9: 48: 1E: A9: 84: AA: DD: 03: 64: 1D: 7C: 08: 42: CE

Как я могу решить эту проблему?

РЕДАКТИРОВАТЬ: Решено благодаря Гийому.Моя проблема заключалась в том, что у меня есть программные файлы / JDK и программные файлы / JRE.Я импортировал в файл cacerts в JDK, в то время как Eclipse использовал JRE.Это было обнаружено благодаря аргументу VM -Djavax.net.debug = ssl.

Кроме того, IP-адрес в:

static {
    HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals("10.31.17.38"));
}

должен совпадать с IP-адресом в переменной requestLink, которой я являюсьс помощью.На самом деле, когда я этого не делал, я получил ошибку, сообщающую мне именно это.

1 Ответ

0 голосов
/ 25 сентября 2018

Возможно, веб-сайт не отправляет полный путь сертификации (включая root).Попробуйте добавить эту опцию VM: -Dcom.sun.security.enableAIAcaIssuers=true

При запуске Java-программы из командной строки ваша команда должна выглядеть следующим образом (как описано в Oracle doc )

java -Dcom.sun.security.enableAIAcaIssuers=true <Main Class>

При запуске из Eclipse опция должна быть добавлена ​​в "VM Arguments:"

...