2010-09-16 4 views
1

Ниже URL Я посылаю к WS после рукопожатия делаетсяОтправьте запрос GET HTTPS, но получите 403 запрещенный ответ, почему?

"https://ekp.truefriend.com/COVIWeb/gate/AutoAuthentication.aspx?UserID=DP0001&BackUrl=http%3a%2f%2fgw.truefriendtest.com%2fCOVIWeb%2fApproval%2fForms%2fForm.aspx%3fmobileyn%3dY%26piid%3d96482621-6cc4-401c-a6f9-5ba6cb7ce26f%26wiid%3d425a9bc9-8607-4898-9158-ed9170da1d89%26fmpf%3dWF_A_DRAFT_PAPER01%26fmrv%3d0%26fiid%3d749526BE-B208-4987-B751-2DD0FC03F0F6%26fmid%3d24f6765d-69d1-429f-b0da-b540a064f0e2%26scid%3ddc4378f1-7edd-4d69-8fe4-5867ed32c8b9" 

Что он должен сделать перенаправляет браузер на BackUrl странице, приведенной в ссылке. Он отображает правильный результат в IE8, несмотря на проблему с сертификатом. В версии для ПК Chrome отображается некоторый код HTML. В Android у меня появляется ошибка 403 Forbidden.

HTTP/1.1 403 Forbidden (The server denied the specified Uniform Resource Locator (URL). Contact the server administrator. ) 

Я использую этот метод для потоковой передачи данных

try{ 
      URL url = new URL(urlString); 
      HttpsURLConnection.setDefaultHostnameVerifier(new FakeHostVerifier()); 

      TrustManager[] trustAllCerts = new TrustManager[]{ 
        new X509TrustManager() { 
         public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
          Log.d("SSLDemo", "getAcceptedIssuers"); 
          return null; 
         } 
         public void checkClientTrusted(
          java.security.cert.X509Certificate[] certs, String authType) { 
          Log.d("SSLDemo", "Check Client Trusted"); 
         } 
         public void checkServerTrusted(
          java.security.cert.X509Certificate[] certs, String authType) { 
          Log.d("SSLDemo", "Check Server Trusted"); 
         } 
        } 
       }; 


    SSLContext sc = SSLContext.getInstance("TLS"); //"TLS" 
      sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
      HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
      int port = 443; 
      SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory(); 
      socket = (SSLSocket)factory.createSocket(url.getHost(), port); 
      socket.startHandshake(); 


      /** 
      * Connection Method 
      */ 
      String method = "GET"; 

      String os = method + " "+urlString+" HTTP/1.0\r\n"; 
      os += "Content-Length: 0"; 
      os += "\r\n\r\n"; 

      ((SSLWeb)this.caller).updateRequest(urlString, method); 

      Log.i("TESTWEB", os); 
      BufferedWriter wout = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
      wout.write(os); 
      wout.flush(); 
      wout.close(); 
      rd = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

      //*********  Not using thread 
      StringBuffer buff = new StringBuffer(); 

      char[] buffer = new char[1024]; 

      while(rd.read(buffer) > -1) { 

       buff.append(buffer); 
       Log.i("TESTWEB", "read buffer :" + String.valueOf(buffer)); 

      } 
      Log.i("TESTWEB", "read line :" + buff.toString()); 

      //********** 

     }catch(Exception e){ 
      Log.e("TESTWEB", "Connecting error", e); 
      e.printStackTrace(); 
     } 

Есть ли что-то случилось с моим кодом? Я думал, что проблема была с параметром URL, но он работает в браузере :(

Я уже найти способ обойти эту проблему за последние три дня, не повезло до сих пор

EDIT:. Это это FakeHostVerifier класс, который используется, чтобы пропустить процесс проверки сертификата. не так ли?

public class FakeHostVerifier implements HostnameVerifier { 
    @Override 
    public boolean verify(String hostname, SSLSession session) { 
     return true; 
    } 

} 
+0

В чем была причина? (Вы отметили ответ, но на самом деле он содержит несколько предложений.) –

+1

@ JaroslavZáruba Это мое плохое. Я больше не уверен, что такое исправление. Извините за неправильное оформление решения. – RobGThai

ответ

5

Как я уже говорил в комментарии к другому ответу, это не имеет никакого отношения к доверенности сертификата сервера или нет. Если вы получаете ответ HTTP, даже если это 403, это означает, что установлено HTTP-соединение, что также означает, что было установлено базовое соединение SSL/TLS. Если ваш клиент не доверяет сертификату сервера, соединение SSL/TLS будет закрыто до того, как произойдет какой-либо HTTP-трафик.

Я бы попробовал несколько вещей:

  • Удалить заголовок Content-Length. Это запрос GET, поэтому он не имеет сущности. Если предположить, что объект длиной 0 строк может запутать сервер.
  • Попробуйте установить заголовок User-Agent, чтобы имитировать запрос, исходящий из браузера.
  • В более общем плане посмотрите на заголовки браузера, который будет работать, и попытайтесь воспроизвести их. (Попробуйте Accept заголовок, а также, что может быть причиной вашей проблемы с Chrome.)

EDIT: (другие потенциальные проблемы, скорее всего, будет причиной)

Если вы urlstring переменная действительно содержит «https://ekp.truefriend.com/COVIWeb/gate/...», вот в чем проблема.

При отправке HTTP GET запрос должен быть таким:

GET /COVIWeb/gate/... HTTP/1.1 
Host: ekp.truefriend.com 

Не:

GET https://ekp.truefriend.com/COVIWeb/gate/... HTTP/1.1 

(это только для запросов через прокси-сервер, и не распространяется на HTTPS запросы в любом случае.)

Если вы используете HTTP 1.0, вы не будете использовать заголовок Host, но это не имеет большого значения (если только этот хост не обслуживает несколько виртуальных хостов, возможно, даже через HTTPS). По возможности используйте HTTP/1.1, хотя вам, возможно, придется иметь дело с закрытием соединения (возможно, длина содержимого или фрагментированная кодировка).

+2

Большое вам спасибо. Эти удивительные детали действительно помогают. – RobGThai

2

Ваш вопрос содержит ответ. при попытке получить доступ к URL, указанный в Chrome, вы получите большое красное предупреждение «The сертификат безопасности сайта не заслуживает доверия ». Хотя вы можете вручную переопределить браузер и игнорировать предупреждение, ваш код рассматривает это как securi проблемы и тупик. Он даже рекомендует обратиться к администратору сервера.

Если вы являетесь администратором сервера, измените сертификат SSL на действующий. если нет, попросите администратора сделать это. В противном случае попробуйте получить доступ к HTTP (не SSL) версии сайта.

+0

Но мой FakeHostVerifier уже переопределяет метод проверки. Почему он все еще отказывается от сертификата? \t public boolean verify (String hostname, SSLSession session) { \t \t return true; \t} – RobGThai

+0

Если клиент не доверяет сертификату (и не позволяет пользователю временно доверять сертификату, как это имеет место здесь), то сеанс SSL/TLS не будет установлен. В результате, HTTP-сообщения не будут обмениваться поверх этого вообще (соединение HTTP не будет установлено). В частности, код статуса HTTP (403, 200, ...) не будет возвращен. Независимо от того, доверяет ли клиент сертификату сервера или нет, это не причина для кода статуса HTTP 403. – Bruno

Смежные вопросы