Android httpget无法工作,原因是;“不受信任的服务器证书”;但它与httpost一起工作

Android httpget无法工作,原因是;“不受信任的服务器证书”;但它与httpost一起工作,android,gettext,Android,Gettext,我有一个代码,需要去下面的网站,并提取文本。在项目的另一部分中,我使用httpost方法,它根据我发送的内容给我一个响应。然而,对于httpget函数,它突然给了我一个异常,称为javax.net.ssl.SSLEXCEPTION:nottrusted server certificate 有办法解决这个问题吗?我不明白为什么一种方法有效而另一种方法无效。谢谢 //some code getText("https://iphone-radar.com/accounts/4e3f

我有一个代码,需要去下面的网站,并提取文本。在项目的另一部分中,我使用httpost方法,它根据我发送的内容给我一个响应。然而,对于httpget函数,它突然给了我一个异常,称为javax.net.ssl.SSLEXCEPTION:nottrusted server certificate

有办法解决这个问题吗?我不明白为什么一种方法有效而另一种方法无效。谢谢

     //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);



        }
    }

我在为学校开发应用程序时遇到了类似的问题。诀窍是创建两个覆盖证书验证的类。 扩展HostnameVerifier并在每次调用verify()时返回true,如。 另一个类扩展了X509TrustManager并重写了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()方法中看到我是如何使用这段代码的。

我在为学校开发应用程序时遇到了类似的问题。诀窍是创建两个覆盖证书验证的类。 扩展HostnameVerifier并在每次调用verify()时返回true,如。 另一个类扩展了X509TrustManager并重写了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()方法中看到我是如何使用这段代码的。

使用下面类似的方法覆盖验证器。使用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();
    }
  }

使用下面的方法覆盖验证器。使用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();
    }
  }

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


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


给出了相同的结果,是否可以选择使用非ssl站点?使用不带https的站点,而使用http确实有效!但是,有没有办法仍然使用https来实现安全目的?iphone-radar.com有一个由3个证书组成的证书链,根CA或中间CA没有安装在android可信证书中(因此,出现了安全错误)。我不知道安装证书的编程方法,一种方法可以是在手机浏览器中直接打开PEM格式的证书:这应该会启动证书导入对话框,并给出相同的结果,是否可以选择使用非ssl站点?使用不带https的网站,而使用http确实有效!但是,有没有办法仍然使用https来实现安全目的?iphone-radar.com有一个由3个证书组成的证书链,根CA或中间CA没有安装在android可信证书中(因此,出现了安全错误)。我不知道安装证书的编程方法,有一种方法可以是在手机浏览器中直接打开PEM格式的证书:这将启动证书导入对话框非常感谢你救了我的命非常感谢你救了我的命