javax.net.ssl. SSLHandshakeException: Удаленный хост закрыл соединение во время квитирования во время веб-сервиса communicaiton

Я получаю javax.net.ssl. SSLHandshakeException: Удаленный хост закрыл соединение во время исключения квитирования, когда я пытаюсь сделать Сообщение HTTPS веб-сервиса через Интернет. Но те же работы кода для другого Интернета разместили веб-сервисы. Я попробовал много вещей, ничто не помогает мне. Я отправил свой пример кода здесь. Кто-либо может помочь мне разрешить эту проблему?

public static void main(String[] args) throws Exception {

    String xmlServerURL = "https://example.com/soap/WsRouter";
    URL urlXMLServer = new URL(xmlServerURL);
    // URLConnection supports HTTPS protocol only with JDK 1.4+ 
    Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(
            "xxxx.example.com", 8083));
    HttpURLConnection httpsURLConnection = (HttpURLConnection) urlXMLServer
            .openConnection(proxy);
    httpsURLConnection.setRequestProperty("Content-Type","text/xml; charset=utf-8");
    //httpsURLConnection.setDoInput(true);
    httpsURLConnection.setDoOutput(true);
    httpsURLConnection.setConnectTimeout(300000);
    //httpsURLConnection.setIgnoreProxy(false);
    httpsURLConnection.setRequestMethod("POST"); 
    //httpsURLConnection.setHostnameVerifier(DO_NOT_VERIFY); 
    // send request
    PrintWriter out = new PrintWriter(
            httpsURLConnection.getOutputStream());
    StringBuffer requestXML = new StringBuffer();
    requestXML.append(getProcessWorkOrderSOAPXML());   
    // get list of user     
    out.println(requestXML.toString()); 
    out.close();
    out.flush();
    System.out.println("XML Request POSTed to " + xmlServerURL + "\n");
    System.out.println(requestXML.toString() + "\n"); 
    //Thread.sleep(60000);  
    // read response

    BufferedReader in = new BufferedReader(new InputStreamReader( 
            httpsURLConnection.getInputStream()));
    String line;
    String respXML = "";
    while ((line = in.readLine()) != null) {
        respXML += line;
    }
    in.close();

    // output response
    respXML = URLDecoder.decode(respXML, "UTF-8"); 
    System.out.println("\nXML Response\n");
    System.out.println(respXML);
}

Полный stacktrace:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
       at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:946)
       at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
       at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
       at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
       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.getOutputStream(HttpURLConnection.java:1091)
       at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250)
       at com.labcorp.efone.vendor.TestATTConnectivity.main(TestATTConnectivity.java:43)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
       at sun.security.ssl.InputRecord.read(InputRecord.java:482)
       at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
       ... 8 more

На самом деле здесь существует два сценария. Когда я работаю автономной программой Java, я получаю вышеупомянутое исключение. Но когда я пытаюсь выполниться в weblogic сервере приложений, я добираюсь ниже исключения: Какая-либо подсказка, какова могла быть причина?

java.io.IOException: Connection closed, EOF detected
    at weblogic.socket.JSSEFilterImpl.handleUnwrapResults(JSSEFilterImpl.java:637)
    at weblogic.socket.JSSEFilterImpl.unwrapAndHandleResults(JSSEFilterImpl.java:515)
    at weblogic.socket.JSSEFilterImpl.doHandshake(JSSEFilterImpl.java:96)
    at weblogic.socket.JSSEFilterImpl.doHandshake(JSSEFilterImpl.java:75)
    at weblogic.socket.JSSEFilterImpl.write(JSSEFilterImpl.java:448)
    at weblogic.socket.JSSESocket$JSSEOutputStream.write(JSSESocket.java:93)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
    at java.io.FilterOutputStream.flush(FilterOutputStream.java:140)
    at weblogic.net.http.HttpURLConnection.writeRequests(HttpURLConnection.java:192)
    at weblogic.net.http.HttpURLConnection.getInputStream(HttpURLConnection.java:433)
    at weblogic.net.http.SOAPHttpsURLConnection.getInputStream(SOAPHttpsURLConnection.java:37)
    at com.labcorp.efone.service.impl.WorkOrderServiceImpl.processATTWorkOrder(ATTWorkOrderServiceImpl.java:86)
    at com.labcorp.efone.bds.WorkOrderBusinessDelegateImpl.processATTWorkOrder(WorkOrderBusinessDelegateImpl.java:59)
    at com.labcorp.efone.actions.ATTWorkOrderAction.efonePerformForward(ATTWorkOrderAction.java:41)
    at com.labcorp.efone.actions.EfoneAction.efonePerformActionForward(EfoneAction.java:149)
    at com.labcorp.efone.actions.EfoneAction.execute(EfoneAction.java:225)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:751)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:844)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:341)
    at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at com.labcorp.efone.security.EfoneAuthenticationFilter.doFilter(EfoneAuthenticationFilter.java:115)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
    at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3367)
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3333)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
    at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2220)
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2146)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2124)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1564)
    at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:295)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:254)
Exception: java.io.IOException: Connection closed, EOF detected
62
задан 25 August 2018 в 00:02

18 ответов

Это - то, что решает мою проблему.

, При попытке использовать отладчик, удостоверяются, что Вы устанавливаете контрольные точки, не находится на URL, или URLConnection просто помещают Вашу точку останова на BufferReader или в цикле с условием продолжения.

, Если ничто не работает, пытаются пользоваться апачской библиотекой http://hc.apache.org/index.html .

никакой SSL, никакое необходимое обновление JDK, никакая потребность установить свойства даже, просто простой прием :)

-3
ответ дан 31 October 2019 в 13:53

То, как Вы решили бы его, путем движения в

  1. Настройки

  2. , Поиск "Сеть"

  3. Выбирает "Use IDEA general proxy settings as default Subversion"

0
ответ дан 31 October 2019 в 13:53

Я столкнулся с той же проблемой однажды. Я думаю из-за Строки URL

xmlServerURL =" https://example.com/soap/WsRouter";

Проверка, является ли это надлежащим или нет??

javax.net.ssl.SSLHandshakeException то, потому что сервер, который не в состоянии соединяться с указанным URL из-за следующей причины -

  • Любой идентификационные данные веб-сайта, не проверяется.
  • сертификат Сервера не соответствует URL.
  • Или, сертификату Сервера не доверяют.
-1
ответ дан 31 October 2019 в 13:53

Я запускаю свое приложение с Java 8 и Java 8 принесенный сертификат безопасности на его базу доверенных сертификатов. Затем я переключился на Java 7 и добавил следующее в опции VM:

-Djavax.net.ssl.trustStore=C:\<....>\java8\jre\lib\security\cacerts

Просто я указал на местоположение, где сертификат.

1
ответ дан 31 October 2019 в 13:53

Можно Записать это ниже кода в текущей программе

System.setProperty("https.protocols", "TLSv1.1");

или

System.setProperty("http.proxyHost", "proxy.com");

System.setProperty("http.proxyPort", "911");

Java
1
ответ дан 31 October 2019 в 13:53

Первый шаг для диагностирования проблемы путем запуска клиента - и если Вы выполняете сервер сами, частный тестовый экземпляр сервера - стартовым Java с опцией VM:

-Djavax.net.debug=all

См. также https://blogs.oracle.com/java-platform-group/entry/diagnosing_tls_ssl_and_https

8
ответ дан 31 October 2019 в 13:53

Я столкнулся с той же проблемой и решил ее путем добавления:

System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");

прежде метод openConnection .

22
ответ дан 31 October 2019 в 13:53

Java 7 значений по умолчанию к TLS 1.0, который может вызвать эту ошибку, когда тот протокол не принят. Я столкнулся с этой проблемой с приложением Tomcat и сервером, который не примет соединения TLS 1.0 больше. Я добавил

-Dhttps.protocols=TLSv1.1,TLSv1.2

к опциям Java, и это зафиксировало его. (Tomcat выполнял Java 7.)

61
ответ дан 31 October 2019 в 13:53

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

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

Просто запись этого здесь в случае, если это заканчивает тем, что помогло любому.

1
ответ дан 31 October 2019 в 13:53

У меня была та же ошибка, но в моем случае она была вызвана Режимом отладки в IDE Intellij. Отладка замедлила библиотеку, и затем сервер закончил коммуникацию в фазе квитирования. "ВЫПОЛНЕННЫЙ" стандарт работал отлично.

1
ответ дан 31 October 2019 в 13:53

Я встретился с подобной проблемой с сервером приложений glassfish и Oracle, JDK/JRE, но не в Открывают JDK/JRE.

При соединении с доменом SSL я всегда сталкивался:

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
...
Caused by: java.io.EOFException: SSL peer shut down incorrectly

решение для меня состояло в том, чтобы установить Расширение криптографии Java (JCE) Неограниченные Файлы политики Юрисдикции Силы , потому что сервер только понял сертификаты, которые не включены в Oracle JDK по умолчанию, только OpenJDK включает их. После установки всего работал как charme.

<час>

JCE 7: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

JCE 8: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

7
ответ дан 31 October 2019 в 13:53

Я встретился с этой проблемой с Java 1.6. Выполнение под Java 1.7 зафиксировало мое особое представление проблемы. Я думаю, что первопричина состояла в том, что сервер, с которым я соединялся, должно быть, потребовал усиленного шифрования, чем было доступно под 1,6.

1
ответ дан 31 October 2019 в 13:53

Добавление сертификатов папке Java\jdk\jre\lib\security работало на меня. Если Вы используете Chrome, нажимают на зеленую лампу [ https://support.google.com/chrome/answer/95617? p=ui_security_indicator& rd=1] и сохраняют сертификат в папке безопасности.

-1
ответ дан 31 October 2019 в 13:53

Благодаря всем для совместного использования Ваших ответов и примеров. Та же автономная программа работала на меня небольшими изменениями и добавлением строк кода ниже.

В этом случае, keystore файл был дан поставщиком веб-сервиса.

// Small changes during connection initiation.. 

// Please add this static block 

      static {

        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier()

            {   @Override

        public boolean verify(String hostname, SSLSession arg1) {

        // TODO Auto-generated method stub

                if (hostname.equals("X.X.X.X")) {

                    System.out.println("Return TRUE"+hostname);

                    return true;

                }

                System.out.println("Return FALSE");

                return false;

              }
               });
         }


String xmlServerURL = "https://X.X.X.X:8080/services/EndpointPort";


URL urlXMLServer = new URL(null,xmlServerURL,new sun.net.www.protocol.https.Handler());


HttpsURLConnection httpsURLConnection = (HttpsURLConnection) urlXMLServer               .openConnection();

// Below extra lines are added to the same program

//Keystore file 

 System.setProperty("javax.net.ssl.keyStore", "Drive:/FullPath/keystorefile.store");

 System.setProperty("javax.net.ssl.keyStorePassword", "Password"); // Password given by vendor

//TrustStore file

System.setProperty("javax.net.ssl.trustStore"Drive:/FullPath/keystorefile.store");

System.setProperty("javax.net.ssl.trustStorePassword", "Password");
1
ответ дан 31 October 2019 в 13:53

Я использовал p12, который я экспортировал со Связкой ключей в моем MacBook, однако, это не работало над моим серверным кодом java-apns. То, что я должен был сделать, должно было создать новый p12 ключ, как указано здесь , с помощью моих уже сгенерированных pem ключей:

openssl pkcs12 -export -in your_app.pem -inkey your_key.pem -out your_app_key.p12

Затем обновил путь к тому новому p12 файлу, и все работало отлично.

0
ответ дан 31 October 2019 в 13:53

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

2
ответ дан 31 October 2019 в 13:53

Я думаю, что Вы пропускаете свои сертификаты.

можно попытаться генерировать их при помощи приложения InstallCerts. Здесь Вы видите, как использовать его: https://github.com/escline/InstallCert

, После того как Вы получаете свой сертификат, необходимо подвергнуть его каталогу безопасности в jdk домой, например:

C:\Program Files\Java\jdk1.6.0_45\jre\lib\security

Сообщенный мне, если это работает.

7
ответ дан 31 October 2019 в 13:53

Не ответ все же, но слишком много для комментария. Это - ясно не проблема сертификата сервера; признаки этого очень отличаются. От POV Вашей системы сервер, кажется, закрывается во время квитирования. Существует две возможности:

сервер действительно закрывается, который является нарушением протокола SSL/TLS хотя довольно незначительное; существует довольно много причин, которые сервер мог бы не квитировать с Вами, но он должен отправить фатальное предупреждение сначала, на которое должны указать Ваш JSSE или weblogic эквивалент. В этом случае в журнале сервера может быть немного полезной информации, если Вы можете (и разрешены) для общения с хорошо осведомленным администратором (администраторами) сервера. Или можно попытаться поместить монитор сети на клиентскую машину или одно достаточно близкое, она видит весь трафик; лично мне нравится www.wireshark.org. Но это обычно показывает только, что завершение сразу прибыло после ClientHello, который не сужает его очень. Вы не говорите, как ли Вы, предполагается, и настроили "клиентский сертификат" (на самом деле key& сертификат, в форме Java privateKeyEntry) для этого сервера; если это требуется сервером и не корректное, некоторые серверы могут чувствовать, что как нападение и сознательно нарушают протокол путем закрытия даже при том, что официально они должны отправить предупреждение.

Или, некоторый middlebox в сети, чаще всего брандмауэр или предположительно прозрачный прокси, решает, что этому не нравятся Ваше соединение и принуждение завершения. Прокси, который Вы используете, является очевидным подозреваемым; когда Вы говорите, что "тот же код" работы к другим хостам, подтвердите, имеете ли Вы в виду через тот же прокси (не только, прокси) и использование HTTPS (не очищают HTTP). Если это не так, попытайтесь тестировать к другим хостам с HTTPS через прокси (Вы не должны отправлять полный запрос SOAP, просто ПОЛУЧЕНИЕ / если достаточно). Если Вы можете, попытаться соединиться без прокси или возможно другого прокси, и соединить HTTP (не S) через прокси к хосту (если обе ясная поддержки), и посмотрите, работают ли они.

, Если Вы не возражаете публиковать фактический хост (но определенно не любые учетные данные аутентификации) другие могут попробовать его. Или можно перейти к www.ssllabs.com и запросить, чтобы они протестировали сервер (не публикуя результаты); это попробует несколько общих вариаций на SSL/соединение TLS и сообщит о любых ошибках, которые он видит, а также любые слабые места безопасности.

16
ответ дан 31 October 2019 в 13:53

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

Похожие вопросы: