Я использую 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.
Кто угодно?




Чтобы 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 ...
Обновил мой ответ, чтобы показать один и тот же процесс на разных вариантах ОС, пожалуйста, проверьте это!
Изменение файла cacerts JVM - очень-очень плохая идея, так как сначала это влияет на все приложения Java в этой системе (может вызвать уязвимость в другом приложении), а во-вторых, вам придется выполнять модификацию снова и снова каждый раз, когда вы обновляете JRE. Вместо этого создайте хранилище доверенных сертификатов для конкретного приложения и используйте его в своем приложении.
Я попытался запустить
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"Responsekeytool 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 tokennewline ''