2013-12-19 70 views
0

我正在實施paypal無聲帖子。這是一次工作,但現在似乎有問題。我得到的錯誤:Paypal SSLHandshakeException

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative DNS name matching www.sandbox.paypal.com found. 
     at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
     at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1886) 
     at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276) 
     at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270) 
     at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341) 
     at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153) 
     at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868) 
     at sun.security.ssl.Handshaker.process_record(Handshaker.java:804) 
     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016) 
     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:515) 
     at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) 
     at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1090) 
     at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250) 
     at com.aceware.sm.servlets.PaypalServlet.doPost(PaypalServlet.java:165) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
     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:724) 
Caused by: java.security.cert.CertificateException: No subject alternative DNS name matching www.sandbox.paypal.com found. 

我使用的代碼關閉paypals的網站,這是建議的握手

// Take the request and get the query string 
    // Read post from PayPal system and add 'cmd' 
    Enumeration en = request.getParameterNames(); 
    String str = "cmd=_notify-validate"; 
    while (en.hasMoreElements()) { 
     String paramName = (String) en.nextElement(); 
     String paramValue = request.getParameter(paramName); 
     str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue, "UTF-8"); 
    } 

    String gateway = "https://www.sandbox.paypal.com/cgi-bin/webscr"; 

    // Post back vars to paypal to validate this transaction 
    URL u = new URL(gateway); 
    URLConnection uc = u.openConnection(); 
    uc.setDoOutput(true); 
    uc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
    try { 
     PrintWriter pw = new PrintWriter(uc.getOutputStream()); 
     pw.println(str); 
     pw.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(PaypalServlet.class.getName()).log(Level.SEVERE, null, ex); 
    } 
+1

嘗試不使用'www。'。如果這不起作用,請使用-Djavax.net.debug = ssl運行客戶端,握手並將輸出編輯到您的問題中。 – EJP

+0

是的,這實際上解決了這個問題。 – Sixthpoint

回答

0

一個解決方案,我發現這是:

urlCon.setHostnameVerifier(new HostnameVerifier() { 
    @Override 
    public boolean verify(String hostname, SSLSession session){ 
     return true; 
    } 
}); 

如果它不起作用,請嘗試使用HttpsURLConnection而不是URLConnection。