Выполнение запроса HTTPS без сертификатов не работает на рабочем столе - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть доступ к Https API.Он работает просто отлично с Почтальоном и с Android-асинхронным Http-клиентом библиотекой.

Но когда я пробую его на настольном Java-приложении,просто говорит:

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

javax.servlet.ServletException: 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
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:558)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:733)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Мой нерабочий код рабочего стола:

HttpURLConnection con;
            String response;
            try {
                con = (HttpURLConnection) new URL(LOGIN_URL).openConnection();
                con.setDoOutput(true);
                con.setRequestMethod("GET");
                OutputStream os = con.getOutputStream(); //throws error
                os.flush();
                return "200";
            } catch (Exception e) {
                e.printStackTrace();
                return e.toString();
            }

Мой рабочий код Android:

AsyncHttpClient client = new AsyncHttpClient();
            RequestParams rp = new RequestParams();
            client.get("LOGIN_URL", rp, new AsyncHttpResponseHandler() {

                @Override
                public void onSuccess(int statusCode, Header[] headers, byte[] response) {

                    return new String(response); //works
                }

            });

Итак, мой вопрос здесь: Еслиможно заставить его работать на Android, почему не работает с Apache HttpComponents или HttpURLConnection методами?

Есть ли какая-нибудь библиотека, которую я могу использовать без установки сертификатов , которые работают так же, как на Android?Я просто хочу доверять веб-сервису без него по ряду причин.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

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

Почтальон доверяет сертификатам, которым вы явно доверяли в своем браузере.

Чтобы обновить файл сертификатов CA, вам нужно найти его, так как вы, вероятно, установили JDK.вы, скорее всего, будете в папке JRE вашего JDK../jdk1.8/jre/lib/security/cacerts

Чтобы добавить сертификат в хранилище доверенных сертификатов, используйте keytool, если java находится в пути к вашей среде, запустите эту команду, где example.der - ваш сертификат.Я бы посоветовал вам также дать ему более подходящее псевдоним.

keytool -import -alias example -keystore /path/to/cacerts -file example.der

Вам будет предложено ввести пароль. По умолчанию javas changeit введите пароль и введите yes когда вас спросят, доверяете ли вы сертификату.

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

keytool -list -v -keystore /path/to/cacerts

Когда я выполнил эту команду, мне дали список;Вы должны быть в состоянии найти сертификат с псевдонимом example.Это случилось с первым в моем списке.

Alias name: digicertglobalrootca [jdk]
Creation date: 26 Aug. 2016
Entry type: trustedCertEntry

Owner: CN=DigiCert Global Root CA, OU=www.digicert.com, O=DigiCert Inc, C=US
Issuer: CN=DigiCert Global Root CA, OU=www.digicert.com, O=DigiCert Inc, C=US
Serial number: 83be056904246b1a1756ac95991c74a
Valid from: Fri Nov 10 10:00:00 AEST 2006 until: Mon Nov 10 10:00:00 AEST 2031
Certificate fingerprints:
     SHA1: A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36
     SHA256: 43:48:A0:E9:44:4C:78:CB:26:5E:05:8D:5E:89:44:B4:D8:4F:96:62:BD:26:DB:25:7F:89:34:A4:43:C7:01:61
Signature algorithm name: SHA1withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3

Вы обновили свой вопрос, добавив, что хотите игнорировать сертификаты ...

Пожалуйста, неигнорировать ошибки сертификата.Разберись с ними.Игнорирование ошибок сертификата открывает соединение с потенциальными атаками MITM.Соблазнительно сказать, что это только для тестового кода, он не будет в конечном итоге в производстве, но мы все знаем, что происходит, когда приближается крайний срок: код не показывает никаких ошибок при тестировании -> мы можем отправить его как есть.

Теперь я знаю, что вы намерены сделать это ВСЕГДА - поэтому здесь - некоторый соответствующий код.

// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public void checkClientTrusted(
            java.security.cert.X509Certificate[] certs, String authType) {
        }
        public void checkServerTrusted(
            java.security.cert.X509Certificate[] certs, String authType) {
        }
    }
};

// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
}

// Now you can access an https URL without having the certificate in the truststore
try {
    URL url = new URL("https://hostname/index.html");
} catch (MalformedURLException e) {
}
0 голосов
/ 05 декабря 2018

Возможно, потому что Postman доверяет сертификатам, которые вы явно указали, что доверяете просмотру, но Java этого не делает.

Попробуйте с этим решением SSLHandshakeException :

Проблема возникает, когда ваш сервер имеет самозаверяющий сертификат.Чтобы обойти это, вы можете добавить этот сертификат в список доверенных сертификатов вашей JVM.

В автор этой статьи описывает, как получить сертификат из браузера и добавить его в файл cacertsваша JVM.Вы можете отредактировать файл JAVA_HOME / jre / lib / security / cacerts или запустить свое приложение с параметром -Djavax.net.ssl.trustStore.Проверьте, какой JDK / JRE вы тоже используете, поскольку это часто приводит к путанице.

См. Также: Как разрешаются имена серверов сертификатов SSL / Могу ли я добавлять альтернативные имена с помощью keytool? Есливы столкнулись с java.security.cert.CertificateException: не найдено имя, соответствующее локальному хосту исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...