Я настраиваю фиды данных с внешнего веб-сайта, а приведенный ниже код работает в средах разработки, QA. Он терпит неудачу только в производстве. Одна вещь, которую я заметил, это то, что WriteToLog в Authenticator не отображается на консоли в производственной среде, тогда как он работает в Dev и QA, где он работает. Может быть, это из-за недостающей библиотеки.Java HttpsURLConnection через прокси не работает, пока wget отлично работает
Я работаю на Java 1.8. Я попытался использовать System.Setproperties, чтобы установить все переменные https.proxyhost, proxyPort, ProxySet, пользователя и пароль. Но это тоже не сработало. Также команда wget и curl работают над производством после установки переменной среды https_proxy.
try {
Proxy ProxyName = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ProxyHostName, ProxyPortNum));
Authenticator Credentials = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
WriteToLog.info(ProxyUserId + ProxyUserKey.toCharArray());
return (new PasswordAuthentication(ProxyUserId, ProxyUserKey.toCharArray()));
}
};
Authenticator.setDefault(Credentials);
DataConnection = (HttpsURLConnection) RequestURL.openConnection(ProxyName);
String uname_pwd = ProxyUserId + ":" + ProxyUserKey;
String authString = "Basic " + new sun.misc.BASE64Encoder().encode(uname_pwd.getBytes());
WriteToLog.info(authString);
DataConnection.setRequestProperty("Proxy-Authorization",authString);
WriteToLog.info(DataConnection.getRequestMethod());
return DataConnection.getInputStream();
} catch (IOException ex) {
WriteToLog.error("HttpsConnectionReturnStream():",ex);
throw ex;
}
Сообщение об ошибке я получаю:
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:992)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1512)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338)
at com.project.fetch.WebAPIReader.HttpsConnectionReturnStream(WebAPIReader.java:186)
at com.project.fetch.WebAPIReader.WebAPIRequestTokenSubmit(WebAPIReader.java:200)
at com.project.run.LaunchApplication.LaunchOperation(LaunchApplication.java:50)
at com.project.run.LaunchApplication.main(LaunchApplication.java:35)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(InputRecord.java:505)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
... 13 more
Когда я добавление System.setProperty ("javax.net.debug", "SSL, рукопожатие") я получить дополнительную информацию:
main, WRITE: TLSv1.2 Handshake, length = 277
main, received EOFException: error
main, handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
main, SEND TLSv1.2 ALERT: fatal, description = handshake_failure
Может кто-нибудь помочь мне в определении того, как отлаживать или решать эту проблему? Я сравнил сертификаты безопасности на QA и Prod, возвращенные отладочным сообщением. Они все подходят. Я попробовал сменить Https.protocol на TLSv1. Но это не работает.
Если вы используете 'Authenticator', вы также не должны предоставлять свои собственные заголовки аутентификации. В JDK нет системного свойства 'proxySet'. Это было частью длинной несуществующей фасоли HotJava c. 1997. Он просочился в многочисленные книги, но ничего не делает. Доказательство: установите значение «false». – EJP
Используете ли вы какие-то сертификаты для подключения к этому серверу? и в среду тестирования и qa? – Oldskultxo
Я думаю, вы должны проверить, не заблокирован ли прокси-порт в рабочей среде. Как правило, порты блокируются в производственной среде. –