httpget не работает из-за «недоверенного сертификата сервера», но работает с httpost - PullRequest
0 голосов
/ 09 августа 2011

У меня есть код, который нужно перейти на сайт ниже и извлечь текст.В другой части проекта я использую метод httpost, и он дает мне ответ на основании того, что я отправил.Однако для функции httpget неожиданно возникает исключение: javax.net.ssl.SSLEXCEPTION: сертификат недоверенного сервера.

Есть ли способ исправить это?Я не понимаю, почему один метод работает, а другой нет.Спасибо

     //some code
    getText("https://iphone-radar.com/accounts/4e3f2c6659f25a0f8400000b");

}
    public static void getText(String uri) {

        HttpClient httpclient = new DefaultHttpClient();

        // Prepare a request object
        HttpGet httpget = new HttpGet(uri); 

        // Execute the request
        HttpResponse response;
        try {
            response = httpclient.execute(httpget);
            // Examine the response status


            // Get hold of the response entity
            HttpEntity entity = response.getEntity();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            android.util.Log.v("EXCEPTION","["+e.getMessage()+"]", e);



        }
    }

Ответы [ 3 ]

2 голосов
/ 09 августа 2011

Используйте что-то вроде ниже, чтобы переопределить верификатор.Код протестирован с использованием Android 2.2

 /**
   * Will cause HttpsURLConnection to accept even self-signed certificates.
   * @param conn
   */
  private static void trustEveryone(HttpsURLConnection conn) {
    try {
      conn.setHostnameVerifier(new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
          return true;
        }
      });
      SSLContext context = SSLContext.getInstance("TLS");
      context.init(null, new X509TrustManager[] { new X509TrustManager() {

        @Override
        public void checkClientTrusted(
            java.security.cert.X509Certificate[] aChain, String aAuthType)
            throws java.security.cert.CertificateException {
        }

        @Override
        public void checkServerTrusted(
            java.security.cert.X509Certificate[] aChain, String aAuthType)
            throws java.security.cert.CertificateException {
        }

        @Override
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
          // TODO Auto-generated method stub
          return new java.security.cert.X509Certificate[0];
        }
      } }, new SecureRandom());
      conn.setSSLSocketFactory(context.getSocketFactory());
    } catch (Exception e) { //handle accordingly
      e.printStackTrace();
    }
  }
2 голосов
/ 09 августа 2011

У меня была похожая проблема при разработке приложения для моей школы.Хитрость заключается в создании двух классов, которые отменяют проверку сертификата.Один расширяет HostnameVerifier и возвращает true каждый раз, когда метод verify () вызывается, например this .Другой класс расширяет X509TrustManager и переопределяет getAcceptedIssuers (), например this .

Затем вы можете настроить HttpsURLConnection на прием всех сертификатов, используя этот код:

HttpsURLConnection.setDefaultHostnameVerifier(new AllVerifier());
try {
    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, new TrustManager[] { new AllTrustManager() }, null);
    HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
} catch (KeyManagementException e) {
    e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
}

Это должносделать трюк.Вы можете увидеть, как я использовал этот код здесь , в методе run ().

0 голосов
/ 17 декабря 2011

Если вы хотите просто игнорировать все проверки SSL-сертификата. Мне помог комментарий по следующей ссылке!

http://code.google.com/p/android/issues/detail?id=1946#c10

...