javax.net.ssl.SSLHandshakeException : 웹 서비스 통신 중 핸드 셰이크 중에 원격 호스트가 연결을 닫았습니다.
나는 점점 오전 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);
}
전체 스택 추적 :
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 프로그램으로 작업 할 때 위의 예외가 발생합니다. 하지만 웹 로직 애플리케이션 서버에서 실행하려고 할 때 아래 예외가 발생합니다. 이유가 무엇인지 알 수 있습니까?
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
Java 7의 기본값은 TLS 1.0으로, 해당 프로토콜이 허용되지 않을 때이 오류가 발생할 수 있습니다. Tomcat 응용 프로그램과 TLS 1.0 연결을 더 이상 허용하지 않는 서버에서이 문제가 발생했습니다. 나는 추가했다
-Dhttps.protocols=TLSv1.1,TLSv1.2
Java 옵션에 추가하고 수정했습니다. (Tomcat은 Java 7을 실행 중이었습니다.)
나는 같은 문제에 직면하고 다음을 추가하여 해결했습니다.
System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");
openConnection 메소드 전에 .
아직 답변은 아니지만 댓글이 너무 많습니다. 이것은 분명히 서버 인증서 문제가 아닙니다. 그 증상은 상당히 다릅니다. 시스템의 POV에서 서버가 핸드 셰이크 중에 닫히는 것처럼 보입니다. 두 가지 가능성이 있습니다.
서버가 실제로 닫히고 있습니다. 이것은 SSL / TLS 프로토콜 위반이지만 상당히 사소한 것입니다. 서버가 사용자와 핸드 셰이크에 실패 할 수있는 몇 가지 이유가 있지만 먼저 치명적인 경고를 보내야합니다. 이는 JSSE 또는 해당 웹 로직에서이를 표시해야합니다. 이 경우 지식이 풍부한 서버 관리자와 통신 할 수 있고 허용 된 경우 서버 로그에 유용한 정보가있을 수 있습니다. 또는 클라이언트 컴퓨터에 네트워크 모니터를 배치하거나 모든 트래픽을 볼 수있을만큼 가까운 곳에 네트워크 모니터를 배치 할 수 있습니다. 개인적으로 나는 www.wireshark.org를 좋아합니다. 그러나 이것은 일반적으로 닫기가 ClientHello 직후에 왔음을 보여 주므로 많이 좁히지 않습니다. 이 서버에 대해 "클라이언트 인증서"(실제로는 Java privateKeyEntry 형식의 key & cert)를 구성해야하는지 여부를 말하지 않습니다.수 공격으로 그것을 인식하고 의도적으로 공식적으로 경고를 보내야한다하더라도 닫아 프로토콜을 위반.
또는 네트워크의 일부 미들 박스 (대부분 방화벽 또는 투명 프록시)가 연결이 마음에 들지 않는다고 판단하고 강제 종료합니다. 사용하는 프록시는 명백한 용의자입니다. "동일한 코드"가 다른 호스트에 대해 작동한다고 말하면 동일한 프록시 (단지 프록시가 아님)를 사용하고 HTTPS (명확한 HTTP가 아님)를 사용 하는지 확인하십시오 . 그렇지 않은 경우 프록시를 통해 HTTPS를 사용하는 다른 호스트에 테스트 해보십시오 (전체 SOAP 요청을 보낼 필요가없고 GET / 충분한 경우). 가능한 경우 프록시없이 또는 다른 프록시없이 연결하고 프록시를 통해 S가 아닌 HTTP를 호스트에 연결하고 (둘 다 지원하는 경우) 작동하는지 확인합니다.
실제 호스트 (인증 자격 증명은 아님)를 게시해도 괜찮다면 다른 사람이 시도해 볼 수 있습니다. 또는 www.ssllabs.com으로 이동하여 결과를 게시하지 않고 서버 테스트를 요청할 수 있습니다. 이것은 SSL / TLS 연결에 대한 몇 가지 일반적인 변형을 시도하고 발견 된 오류와 보안 약점을보고합니다.
문제를 진단하는 첫 번째 단계는 VM 옵션으로 Java를 시작하여 클라이언트를 시작하는 것입니다. 서버를 직접 실행하는 경우 서버의 비공개 테스트 인스턴스입니다.
-Djavax.net.debug=all
https://blogs.oracle.com/java-platform-group/entry/diagnosing_tls_ssl_and_https 도 참조하십시오.
Glassfish 애플리케이션 서버 및 Oracle JDK / JRE에서 유사한 문제가 발생했지만 Open JDK / JRE에서는 발생하지 않았습니다.
SSL 도메인에 연결할 때 항상 다음과 같은 문제가 발생했습니다.
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
...
Caused by: java.io.EOFException: SSL peer shut down incorrectly
저에게 해결책은 JCE (Java Cryptography Extension) Unlimited Strength Jurisdiction Policy Files 를 설치하는 것이 었습니다 . 서버는 기본적으로 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
인증서가 누락 된 것 같습니다.
InstallCerts 앱을 사용하여 생성을 시도 할 수 있습니다. 여기에서 사용 방법을 볼 수 있습니다 : https://github.com/escline/InstallCert
인증서를 받으면이를 jdk 홈의 보안 디렉토리에 넣어야합니다. 예를 들면 다음과 같습니다.
C:\Program Files\Java\jdk1.6.0_45\jre\lib\security
작동하는지 알려주세요.
비슷한 문제가 발생하여 잘못된 포트에 연결되었음을 알았습니다. 항구를 고친 후 모든 것이 잘 작동했습니다.
귀하의 답변과 예를 공유해 주신 모든 분들께 감사드립니다. 동일한 독립 실행 형 프로그램이 약간의 변경과 아래 코드 줄을 추가하여 저에게 효과적이었습니다.
이 경우 키 저장소 파일은 웹 서비스 공급자가 제공했습니다.
// 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");
Java 1.6에서이 문제가 발생했습니다. Java 1.7에서 실행하면 문제의 특정 표현이 수정되었습니다. 근본적인 원인은 연결하려는 서버가 1.6 미만에서 사용할 수있는 것보다 더 강력한 암호화를 필요로했기 때문이라고 생각합니다.
동일한 오류가 발생했지만 제 경우에는 Intellij IDE의 DEBUG 모드로 인해 발생했습니다. 디버그로 인해 라이브러리 속도가 느려지고 서버가 핸드 셰이크 단계에서 통신을 종료했습니다. 표준 "RUN"은 완벽하게 작동했습니다.
In my case, I got this problem because I had given the server a non-existent certificate, due to a typo in the config file. Instead of throwing an exception, the server proceeded like normal and sent an empty certificate to the client. So it might be worth checking to make sure that the server is providing the correct response.
I experienced this error while using the Jersey Client to connect to a server. The way I resolved it was by debugging the library and seeing that it actually did receive an EOF the moment it tried to read. I also tried connecting using a web browser and got the same results.
Just writing this here in case it ends up helping anyone.
I run my application with Java 8 and Java 8 brought security certificate onto its trust store. Then I switched to Java 7 and added the following into VM options:
-Djavax.net.ssl.trustStore=C:\<....>\java8\jre\lib\security\cacerts
Simply I pointed to the location where a certificate is.
You May Write this below code insdie your current java programme
System.setProperty("https.protocols", "TLSv1.1");
or
System.setProperty("http.proxyHost", "proxy.com");
System.setProperty("http.proxyPort", "911");
I was using the p12 which I exported with Keychain in my MacBook, however, it didn't work on my java-apns server code. What I had to do was to create a new p12 key as stated here, using my already generated pem keys:
openssl pkcs12 -export -in your_app.pem -inkey your_key.pem -out your_app_key.p12
Then updated the path to that new p12 file and everything worked perfectly.
How you would solve it is by going to
Settings
Search"Network"
Choose "Use IDEA general proxy settings as default Subversion"
Adding certificates to Java\jdk\jre\lib\security folder worked for me. If you are using Chrome click on the green bulb [https://support.google.com/chrome/answer/95617?p=ui_security_indicator&rd=1] and save the certificate in security folder.
I faced the same issue once. I think its because of the URL
String xmlServerURL = "https://example.com/soap/WsRouter";
Check whether its a proper one or not ??
javax.net.ssl.SSLHandshakeException
is because the server not able to connect to the specified URL because of following reason-
- Either the identity of the website is not verified.
- Server's certificate does not match the URL.
- Or, Server's certificate is not trusted.
This is what solve my problem.
If you are trying to use debugger make sure you breakpoint is not on URL or URLConnection just put your breakpoint on BufferReader or inside while loop.
If nothing works try using apache library http://hc.apache.org/index.html.
no SSL, no JDK update needed, no need to set properties even, just simple trick :)
'development' 카테고리의 다른 글
SQL Server 2012에서 Excel로 데이터를 복사 할 때 줄 바꿈 문제 (0) | 2020.11.27 |
---|---|
PhpStorm에서 파일을 검색하는 방법은 무엇입니까? (0) | 2020.11.27 |
Swift에서 인수 레이블은 언제 필요합니까? (0) | 2020.11.27 |
Spark에서 데이터 프레임 열 업데이트 (0) | 2020.11.27 |
IEnumerable을 DataTable로 변환 (0) | 2020.11.27 |