2016-01-23 5 views
14

मुझे सैंडबॉक्स मोड में PayPal MassPay API का उपयोग करते समय अपवाद मिल रहा है।पेपैल सैंडबॉक्स एपीआई: javax.net.ssl.SSLHandshakeException: घातक चेतावनी प्राप्त की: हैंडशेक_फेलर

उसी कोड ने पहले काम किया था, अब यह मुझे SSLHandshakeException दे रहा है। मुझे लगता है कि यह पेपैल के नवीनतम एसएसएल प्रमाणन अद्यतनों के कारण है। क्या कोई इस मुद्दे को ठीक करने में मेरी मदद कर सकता है?

निम्नलिखित मेरी अपवाद लॉग है:

http-bio-9090-exec-1, READ: TLSv1 Alert, length = 2 
http-bio-9090-exec-1, RECV TLSv1 ALERT: fatal, handshake_failure 
http-bio-9090-exec-1, called closeSocket() 
http-bio-9090-exec-1, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
com.paypal.core.rest.PayPalRESTException: Received fatal alert: handshake_failure 
    at com.paypal.core.rest.PayPalResource.execute(PayPalResource.java:374) 
    at com.paypal.core.rest.PayPalResource.configureAndExecute(PayPalResource.java:225) 
    at com.paypal.sdk.openidconnect.Tokeninfo.createFromAuthorizationCode(Tokeninfo.java:245) 
    at com.oldwallet.controllers.CouponPaymentController.redeemed(CouponPaymentController.java:321) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:844) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1008) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) 
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1959) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077) 
    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.getInputStream(HttpURLConnection.java:1300) 
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338) 
    at com.paypal.core.HttpConnection.execute(HttpConnection.java:93) 
    at com.paypal.core.rest.PayPalResource.execute(PayPalResource.java:367) 
    ... 36 more 

उत्तर

22

मुद्दा यह है कि हाल ही में पेपैल (19 वीं या जनवरी की 20 वीं) TLS 1.2 सैंडबॉक्स बंद और TLS का समर्थन नहीं करते है 1 अब और। मुझे लगता है कि आप जावा एसई 7 या पुराने पर चल रहे हैं। आप नेट थोड़ा खोज करते हैं तो आप इस मिलेगा:

हालांकि जावा SE 7 रिलीज में SunJSSE TLS 1.1 और TLS 1.2 का समर्थन करता है, न तो संस्करण ग्राहक कनेक्शन के लिए डिफ़ॉल्ट रूप से सक्षम है। कुछ सर्वर आगे संगतता को सही ढंग से कार्यान्वित नहीं करते हैं और टीएलएस 1.1 या टीएलएस 1.2 क्लाइंट से बात करने से इनकार करते हैं। इंटरऑपरेबिलिटी के लिए, सनजेएसएसई क्लाइंट कनेक्शन के लिए डिफ़ॉल्ट रूप से टीएलएस 1.1 या टीएलएस 1.2 सक्षम नहीं करता है। -Dhttps.protocols=TLSv1.1,TLSv1.2 तो यह काम करेगा:

Link

आप वी एम के निम्न सेटिंग का उपयोग कर सकते हैं TLS 1.2 सक्षम करने के लिए।

आप हाथ मिलाना तो आप इस वीएम विकल्प का उपयोग कर सकते हैं के बारे में अधिक विवरण देखने के लिए चाहते हैं:

*** ClientHello, TLSv1

: यदि आप कुछ इस तरह दिखाई -Djavax.net.debug=all

तो फिर तुम इस बात की पुष्टि कर सकते हैं कि TLS 1.2 अक्षम किया गया है

सर्वर प्रतिक्रिया पढ़ने के बाद अपवाद फेंक दिया जाएगा। जावा 8 में ऐसी कोई समस्या नहीं है क्योंकि डिफ़ॉल्ट रूप से टीएलएस 1.2 सक्षम है।

वर्तमान में केवल सैंडबॉक्स प्रभावित है। आप पेपैल की साइट पर पढ़ सकते हैं:

पेपैल 17 जून, 2016 को कनेक्शन सभी HTTPS के लिए TLS v1.2 की आवश्यकता के लिए उस तारीख, सभी टीएलएस v1.0 और TLS v1.1 के बाद अपनी सेवाओं अपडेट कर रहा है एपीआई कनेक्शन से मना कर दिया जाएगा।

अधिकतर संभावना यह और भी स्थगित कर दी जाएगी।

आप इस सरल थ्रो-दूर कोड के साथ समस्या और प्रयोग पुन: पेश कर सकते हैं:

URL sandbox = new URL("https://api.sandbox.paypal.com/v1/oauth2/token"); 
URLConnection yc = sandbox.openConnection(); 

BufferedReader in = new BufferedReader(new InputStreamReader(
    yc.getInputStream())); 
String inputLine; 
while ((inputLine = in.readLine()) != null) 
    System.out.println(inputLine); 
in.close(); 
4

http-जैव-9090-कार्यकारी -1, Recv TLSv1 चेतावनी: घातक, handshake_failure

ऐसा लगता है कि एक का उपयोग कर रहे टीएलएस का पुराना संस्करण। पेपैल ने हाल ही में (कुछ दिन पहले) अपने सैंडबॉक्स में बदलाव किया था ताकि सभी कनेक्शन HTTP 1.1 और टीएलएस 1.2 पर किए जा सकें। टीएलएस (1.2) के नए संस्करण का उपयोग करने के लिए अपना कोड सेट करने का प्रयास करें और देखें कि क्या इससे मदद मिलती है। जाहिर है यह यहां बहुत से लोगों के लिए काम किया है।

पेपैल देव ब्लॉग पर परिवर्तन वर्णन करने के लिए लिंक

https://devblog.paypal.com/upcoming-security-changes-notice/

1

मैं एक ही समस्या (Paypal TLS 1.2 बनाम JRE 1.6) इस सप्ताह के साथ काम किया गया है। कुछ पागल घंटों के बाद, मैंने बाउंसीकास्टल का उपयोग करके समस्या को हल करने में कामयाब रहा और कुछ कोड मुझे गर्व नहीं है (जैसे पैच के रूप में। स्थायी समाधान जेआरई 1.8 में अपग्रेड हो जाएगा)।

BouncyCastle निर्भरता:

<dependency> 
    <groupId>org.bouncycastle</groupId> 
    <artifactId>bcprov-jdk15on</artifactId> 
    <version>1.54</version> 
</dependency> 

मेरे काम कर कोड:

package es.webtools.eencuesta.redsys.component.impl; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.net.URL; 
import java.net.URLDecoder; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Map.Entry; 

import org.bouncycastle.crypto.tls.CertificateRequest; 
import org.bouncycastle.crypto.tls.DefaultTlsClient; 
import org.bouncycastle.crypto.tls.TlsAuthentication; 
import org.bouncycastle.crypto.tls.TlsClientProtocol; 
import org.bouncycastle.crypto.tls.TlsCredentials; 

import es.webtools.eencuesta.common.util.HttpUtils; 

public class PayPayAPIHandler { 

    public static Map<String, String> doAPIRequest(Map<String, String> paramMap) { 

    StringBuilder data = new StringBuilder(); 
    Iterator<Entry<String, String>> paramIt = paramMap.entrySet().iterator(); 
    while (paramIt.hasNext()) { 
     Entry<String, String> param = paramIt.next(); 
     data.append(param.getKey()).append("=").append(HttpUtils.encodeUTF8(param.getValue())); 
     if (paramIt.hasNext()) { 
      data.append("&"); 
     } 
    } 

    try { 
     URL url = new URL("https://api-3t.sandbox.paypal.com/nvp"); 

     // TODO #39 Utilizar HttpConnection (Java 8 implementa TLS 1.2, necesaria para comunicación con PayPal) 
     java.security.SecureRandom secureRandom = new java.security.SecureRandom(); 
     Socket socket = new Socket(java.net.InetAddress.getByName(url.getHost()), 443); 
     TlsClientProtocol protocol = new TlsClientProtocol(socket.getInputStream(), socket.getOutputStream(), secureRandom); 
     DefaultTlsClient client = new DefaultTlsClient() { 
      public TlsAuthentication getAuthentication() throws IOException { 
       TlsAuthentication auth = new TlsAuthentication() { 
        // Capture the server certificate information! 
        public void notifyServerCertificate(org.bouncycastle.crypto.tls.Certificate serverCertificate) throws IOException { 
        } 

        public TlsCredentials getClientCredentials(CertificateRequest certificateRequest) throws IOException { 
         return null; 
        } 
       }; 
       return auth; 
      } 
     }; 

     protocol.connect(client); 
     java.io.OutputStream output2 = protocol.getOutputStream(); 
     output2.write(("POST " + url.getPath() + " HTTP/1.1\r\n").getBytes("UTF-8")); 
     output2.write(("Host: " + url.getHost() + "\r\n").getBytes("UTF-8")); 
     output2.write("Connection: close\r\n".getBytes("UTF-8")); // So the server will close socket immediately. 
     output2.write(("Content-Length: " + data.length() + "\r\n").getBytes("UTF-8")); // So the server will close socket immediately. 
     output2.write("Content-Type:text/plain; charset=UTF-8\r\n".getBytes("UTF-8")); // So the server will close socket immediately. 
     output2.write("\r\n".getBytes("UTF-8")); // HTTP1.1 requirement: last line must be empty line. 
     output2.write(data.toString().getBytes("UTF-8")); 
     output2.flush(); 

     InputStream input2 = protocol.getInputStream(); 
     StringBuilder stringBuffer = new StringBuilder(); 
     try { 
      InputStreamReader reader = new InputStreamReader(input2, "UTF-8"); 
      int ch; 
      while ((ch = reader.read()) > -1) { 
       stringBuffer.append((char) ch); 
      } 
      reader.close(); 
     } catch (Exception e) { 
      // Log some messages... 
     } 

     Map<String, String> result = new HashMap<String, String>(); 
     String[] lines = stringBuffer.toString().split("\r\n"); 
     String paramsLine = ""; 
     for (int i = 0; i < lines.length; i++) { 
      if (lines[i].equals("")) { 
       paramsLine = lines[i + 1]; 
       i = lines.length; 
      } 
     } 

     // El contenido de la respuesta vendrá después del salto de linea 
     for (String param : paramsLine.split("&")) { 
      String[] keyValue = param.split("="); 
      result.put(keyValue[0], URLDecoder.decode(keyValue[1], "UTF-8")); 
     } 

     return result; 
    } catch (Exception e) { 
     // Log some messages.... 
     return null; 
    } 
} 

} 
1

आप https कॉल कर रहे हैं एक वेब सेवा से या जावा में एक स्वतंत्र अनुप्रयोग में अनुरोध करते हैं, इसे बनाने के लिए निम्न पंक्ति का उपयोग कार्य:

System.setProperty(“https.protocols”, “TLSv1,TLSv1.1,TLSv1.2”); 
+0

नहीं, – maxivis

+0

काम नहीं करता यह वास्तव में काम करता है। मैंने अभी 'System.setProperty ("https.protocols", "TLSv1.1, TLSv1.2, SSLv3, SSLv2Hello") जोड़ा है; ' यह मेरे लिए समाधान था –

0

मेरी समस्या यह थी कि मेरे पास जावा 7 स्थापित था इसलिए मैंने जावा में अपग्रेड किया एक 8 और voila, अपवाद अब और नहीं था :)

संबंधित मुद्दे