2016-01-23 8 views
14

PayPal MassPay APIをサンドボックスモードで使用しているときに例外が発生しています。Paypal Sandbox API:javax.net.ssl.SSLHandshakeException:致命的な警告を受け取った:handshake_failure

同じコードが以前に動作しましたが、現在はSSLHandshakeExceptionです。私はこれがPayPalの最新のSSL証明書更新のためだと思う。誰かがこの問題を解決する手助けをすることができますか?

は私の例外ログです:

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

問題は、PayPalの最近(19か月の第20回)はTLS 1.2にサンドボックスを切り替えてTLSをサポートしていないということです1になりました。私はあなたがJava SE 7以上で動作していると思います。あなたがネットを少し検索する場合は、この見つける:

をするJava SE 7リリースのSunJSSEは、TLS 1.1およびTLS 1.2をサポートしていますが、どちらのバージョンは、クライアント接続のためのデフォルトで有効になっています。一部のサーバーでは、前方互換性が正しく実装されていないため、 はTLS 1.1またはTLS 1.2クライアントとの通信を拒否します。相互運用性のために、 SunJSSEは、クライアント 接続に対して、デフォルトでTLS 1.1またはTLS 1.2を有効にしません。 -Dhttps.protocols=TLSv1.1,TLSv1.2はその後、それが動作します:Link

を使用すると、VMの次の設定を使用することができTLS 1.2を有効にするには。

*** ClientHello, TLSv1

:あなたはこのような何かを見る場合はTLS 1.2が無効になっていることを確認することができるその後 -Djavax.net.debug=all

あなたは、このVMオプションを使用することができ、ハンドシェイクの詳細を確認したい場合は

サーバーの応答が読み取られると、例外がスローされます。 TLS 1.2はデフォルトで有効になっているため、Java 8にはこのような問題はありません。

現在のところ、サンドボックスのみが影響を受けます。あなたはPayPalのサイトで読むことができます:

PayPalはその日、すべてのTLS v1.0のとTLS v1.1の後、すべてのHTTPSのために6月17日、2016年に 接続をTLS 1.2以降を必要とし、そのサービスを更新していますAPI接続は拒否されます。

これはおそらくさらに延期される可能性があります。

あなたはこの単純な使い捨てのコードの問題と実験の再現可能性があります

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-EXEC-1は、RECV TLSv1のALERT:あなたが使用しているように致命的な、握手_

が見えます古いバージョンのTLS最近のPayPal(数日前)は、すべての接続をHTTP 1.1とTLS 1.2で行うようにサンドボックスを変更しました。新しいバージョンのTLS(1.2)を使用するようにコードを設定し、それが役立つかどうか確認してください。どうやら、ここには多くの人々のために働いています。

ペイパルのdevのブログ上の変更の説明へのリンクは

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

1

を私は今週と同じ問題(JRE 1.6対ペイパルTLS 1.2)を扱ってきました。クレイジーな時間がたつと、私はBouncyCastleと私が誇りに思っていないコードを使って問題を解決することができました(パッチと永続的なソリューションがJRE 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を呼び出している場合は、WebサービスまたはJavaでスタンドアロンアプリケーションに要求し、それを作るために以下の行を使用します仕事:

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

いいえ、動作しません – maxivis

+0

これは実際に働いた。 'System.setProperty(" https.protocols "、" TLSv1.1、TLSv1.2、SSLv3、SSLv2Hello ");' これは私のための解決策でした –

0

私の問題は、Java 7をインストールしていたため、jav 8とボイラー、例外はもうありませんでした:)

関連する問題