由于“不受信任的服务器证书”,httpget无法正常工作,但它适用于http post

时间:2011-08-08 21:58:51

标签: android gettext

我有一个代码需要访问下面的网站并提取文本。在项目的另一部分,我使用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 个答案:

答案 0 :(得分:2)

在为我的学校开发应用程序时遇到了类似的问题。诀窍是创建两个覆盖证书验证的类。 一个扩展HostnameVerifier并在每次调用verify()时返回true,如this。 另一个类扩展了X509TrustManager并覆盖了this之类的getAcceptedIssuers()。

然后,您可以使用此代码将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()方法中看到我如何使用此代码here

答案 1 :(得分:2)

使用以下内容覆盖验证程序。使用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 :(得分:0)

如果您想忽略所有SSL证书检查。以下链接的评论帮助了我!

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