Разрешить HTTPS-соединения в HttpURLConnection

Я использую HttpURLConnection для выполнения запросов POST.

Я читал, что HttpsURLConnection расширяет HttpURLConnection за счет поддержки специфичных для https функций, таких как SSL

Если HttpsURLConnection использует те же методы в HttpURLConnection (родительский класс), он вызывает методы из HttpURLConnection.

        URL url = new URL(callBackUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setConnectTimeout(setConnectTimeout);
        connection.setReadTimeout(setConnectTimeout);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");

        OutputStreamWriter os = new OutputStreamWriter(connection.getOutputStream());
        os.write(data.toString());

        os.flush();
        os.close();

        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            BufferedReader br = new BufferedReader(new InputStreamReader((connection.getInputStream())));

            while ((output = br.readLine()) != null) {
                stringBuffer.append(output);

            }
        }

Однако, когда я использую URL-адрес HTTPS, я продолжаю получать ошибку, указанную ниже;

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[na:1.8.0_181]
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1964) ~[na:1.8.0_181]
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:328) ~[na:1.8.0_181]
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:322) ~[na:1.8.0_181]

Вопрос, как мне обрабатывать как SSL-соединение, так и соединение без SSL, как в случае с PHP, где при использовании CURL вы устанавливаете игнорирование проверки SSL

curl_setopt($cHandler, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($cHandler, CURLOPT_SSL_VERIFYPEER, true);

Я использую Linux, Spring framework и TomCat Web Server.

Кто угодно?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
419
1

Ответы 1

Чтобы HTTPS заработал в первую очередь, вам нужно добавить свой SSL-сертификат в хранилище доверенных сертификатов Java ... Для этого вам нужно будет выполнить следующие шаги:

Обычно файл хранилища доверенных сертификатов используемой JVM находится на %JAVA_HOME%\lib\security\cacerts.

Сначала вы можете проверить, добавлен ли ваш сертификат в хранилище доверенных сертификатов, выполнив следующую команду:

keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"

Убедившись, что он не добавлен в ваше хранилище доверенных сертификатов Java, вы можете использовать следующую команду, чтобы добавить его:

keytool -import -noprompt -trustcacerts -alias <AliasName> -file   <certificate> -keystore <KeystoreFile> -storepass <Password>

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

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ-1: Вышеупомянутый метод помогает добавить сертификат SSL в среду Windows. Пожалуйста, проверьте следующий статья для варианта Linux ...

Я попытался запустить keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts" Response keytool error: java.lang.Exception: Keystore file does not exist: %JAVA_HOME%/jre/lib/security/cacerts При выполнении второй команды keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password> я продолжаю получать bash: syntax error near unexpected token newline ''

Click 09.09.2018 11:04

Обновил мой ответ, чтобы показать один и тот же процесс на разных вариантах ОС, пожалуйста, проверьте это!

N00b Pr0grammer 09.09.2018 11:30

Изменение файла cacerts JVM - очень-очень плохая идея, так как сначала это влияет на все приложения Java в этой системе (может вызвать уязвимость в другом приложении), а во-вторых, вам придется выполнять модификацию снова и снова каждый раз, когда вы обновляете JRE. Вместо этого создайте хранилище доверенных сертификатов для конкретного приложения и используйте его в своем приложении.

Robert 09.09.2018 12:36

Другие вопросы по теме