我有一个代码需要访问下面的网站并提取文本。在项目的另一部分,我使用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);
}
}
答案 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证书检查。以下链接的评论帮助了我!