2016-01-24 4 views
2

Я настраиваю фиды данных с внешнего веб-сайта, а приведенный ниже код работает в средах разработки, 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. Но это не работает.

+0

Если вы используете 'Authenticator', вы также не должны предоставлять свои собственные заголовки аутентификации. В JDK нет системного свойства 'proxySet'. Это было частью длинной несуществующей фасоли HotJava c. 1997. Он просочился в многочисленные книги, но ничего не делает. Доказательство: установите значение «false». – EJP

+0

Используете ли вы какие-то сертификаты для подключения к этому серверу? и в среду тестирования и qa? – Oldskultxo

+0

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

ответ

0

Я пробовал жестко кодировать IP-адрес вместо полного имени хоста для прокси-сервера. После этого код работал отлично. Не знаете, почему JVM не может разрешить имя хоста, когда он работает из командной строки, используя ping, wget или curl.