2012-04-27 3 views
2

Как и многие другие, я пытаюсь связаться с сайтом с самозаверяющим сертификатом. Существует много многих классов и фрагментов кода, показывающих, как это сделать, например. HTTPS GET (SSL) with Android and self-signed server certificate, но я не могу найти то, что показывает, как на самом деле использовать классы. Я много экспериментировал, и я уверен, что я просто пропустил что-то простое.Android: игнорирование самоподписанных ошибок сертификата; Фактическая реализация?

В частности, я стараюсь использовать классы, поставляемые «Мосом»; ответ с большинством голосов. Я все еще всегда получаю сообщение «Не доверяемый сертификат». Еще один человек в этой теме также попросил рекомендации по внедрению, но на него не ответил. Спасибо за любую помощь.

Если бы я мог добавить этот вопрос к этой теме, я был бы намного счастливее, но я думаю, что новички, подобные мне, могут только публиковать новые вопросы (хотя я был поклонником SO более года).

ответ

2

В некоторых наших проектах мы используем аналогичные SocketFactory и X509TrustManager. Чтобы привязать эти классы к вашей реализации, все, что вам в основном нужно сделать, это подключить их к HttpClient (предполагая, что это то, что вы используете), используемое для связи клиент-сервер.

Обычно у нас есть способ создать HttpClient с указанным фабрикой и доверителем. Это выглядит примерно так и свободно основано на ссылке, приведенной во встроенных комментариях.

protected HttpClient constructClient() { 
    HttpParams params = new BasicHttpParams(); 
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 

    // use the debug proxy to view internet traffic on the host computer 
    if (ABCApplication.isDebuggingProxy()) params.setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(ABCConstants.DEBUG_PROXY_HOST, ABCConstants.DEBUG_PROXY_PORT, "http")); 

    // ignore ssl certification (due to signed authority not appearing on android list of permitted authorities) 
    // see: http://blog.antoine.li/2010/10/22/android-trusting-ssl-certificates/ 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", new PlainSocketFactory(), 80)); 
    registry.register(new Scheme("https", new FakeSocketFactory(), 443)); 
    ClientConnectionManager cm = new SingleClientConnManager(params, registry); 

    return new DefaultHttpClient(cm, params); 
} 

Надеюсь, что это поможет с вашей реализацией.

+0

Это не только помогает, он просто работает! Он выглядит примерно так же, как и все остальные, которые я пытался делать, но они добавляли еще несколько параметров. Они также, похоже, предпочитают использовать ThreadSafeClientConnManager вместо Single. Когда у меня будет время, я расскажу о разнице. Thanx !! (Если бы у меня была репутация, я бы ответил +1). – MBro

2

Мы можем также использовать

HttpURLConnection http = null; 
      URL url; 
      try { 
       url = new URL("https:your domian"); 

       if (url.getProtocol().toLowerCase().equals("https")) { 
        trustAllHosts(); 
        HttpsURLConnection https = (HttpsURLConnection) url.openConnection(); 
        https.setHostnameVerifier(DO_NOT_VERIFY); 
        http = https; 
        System.out.println("TEST:::"+convertStreamToString(http.getInputStream())); 
       } else { 
        http = (HttpURLConnection) url.openConnection(); 
        System.out.println("TEST:::"+convertStreamToString(http.getInputStream())); 
       } 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 


/******* 
* Trust every server - don't check for any certificate 
*/ 
private static void trustAllHosts() { 
    // Create a trust manager that does not validate certificate chains 
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return new java.security.cert.X509Certificate[] {}; 
     } 

     public void checkClientTrusted(X509Certificate[] chain, 
       String authType) throws CertificateException { 
     } 

     public void checkServerTrusted(X509Certificate[] chain, 
       String authType) throws CertificateException { 
     } 
    } }; 

    // Install the all-trusting trust manager 
    try { 
     SSLContext sc = SSLContext.getInstance("TLS"); 
     sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
     HttpsURLConnection 
       .setDefaultSSLSocketFactory(sc.getSocketFactory()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 



final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() { 
    public boolean verify(String hostname, SSLSession session) { 
     return true; 
    } 
}; 
Смежные вопросы