Android平台联网的时候遇到SSL证书无效的处理办法


最近在关注微博开发平台,前几日在腾讯微博开放平台创建了一个应用,中途越到了些问题:

1、关于Oauth授权,第一次接触的时候,也晕了很久,一下子接触了很多新东西,要慢慢消化,不过到最后也都还消化的不错。主要有urlencode、basestring、signature、base64encode等。

2、联网。之前一直没有尝试使用过联网,这些一来就闷在哪里。URL、URLConnction、HttpURLConnection、HttpClient、HttpPost、HttpGet。还好腾讯在授权的时候支持Get方式,相对新浪和网易,此处较为简单。

3、发布微博中文乱码。这个主要是创建应用的时候就没有选好编码,中间编程的时候代码考来考去导致的。

下面介绍的是一个无关微博问题,不过这个问题是在微博开发中遇到的。

前天,腾讯微博服务器调试出现了小状况,很多原本可以正常授权的应用都变成无法授权。个人也刚好调试到此问题,因为之前调试过均正常,也不敢贸然说服务器有问题,仔细检查了一遍又一遍的代码,将调试结果输出显示,并对照参考上网搜索,而后大概知道是遇到了服务器SSL证书无效。此后,不时的有开发者也在qq群中反馈问题,可以肯定是服务器的问题了。

那么,遇到服务器SSL证书无效会出现哪些异常?有如何处理?

正常情况下,如果SSL证书无效,那么java会抛出SSLException。在Oauth授权的时候,如果碰到SSLException异常,我们就无法获取oauth_token和oauth_token_secret了。

解决方法很简单:那就是直接信任所有的证书,而不去检查证书的有效性。下面有个网上提供的类,使用的时候只要在联网前调用该类的allowAllSSL()函数即可。

  1. public class _FakeX509TrustManager implements X509TrustManager {  
  2.   
  3.     private static TrustManager[] trustManagers;  
  4.     private static final X509Certificate[] _AcceptedIssuers = new  
  5.     X509Certificate[] {};  
  6.   
  7.     @Override  
  8.     public void checkClientTrusted(X509Certificate[] chain, String  
  9.             authType) throws CertificateException {  
  10.     }  
  11.   
  12.     @Override  
  13.     public void checkServerTrusted(X509Certificate[] chain, String  
  14.             authType) throws CertificateException {  
  15.     }  
  16.   
  17.     public boolean isClientTrusted(X509Certificate[] chain) {  
  18.         return true;  
  19.     }  
  20.   
  21.     public boolean isServerTrusted(X509Certificate[] chain) {  
  22.         return true;  
  23.     }  
  24.   
  25.     @Override  
  26.     public X509Certificate[] getAcceptedIssuers() {  
  27.         return _AcceptedIssuers;  
  28.     }  
  29.   
  30.     public static void allowAllSSL() {  
  31.         HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){  
  32.   
  33.             @Override  
  34.             public boolean verify(String arg0, SSLSession arg1) {  
  35.                 // TODO Auto-generated method stub   
  36.                 return true;  
  37.             }  
  38.   
  39.         });  
  40.   
  41.         SSLContext context = null;  
  42.         if (trustManagers == null) {  
  43.             trustManagers = new TrustManager[] { new _FakeX509TrustManager() };  
  44.         }  
  45.   
  46.         try {  
  47.             context = SSLContext.getInstance("TLS");  
  48.             context.init(null, trustManagers, new SecureRandom());  
  49.         } catch (NoSuchAlgorithmException e) {  
  50.             e.printStackTrace();  
  51.         } catch (KeyManagementException e) {  
  52.             e.printStackTrace();  
  53.         }  
  54.   
  55.         HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());  
  56.     }  
  57.   
  58. }   

使用实例:

_FakeX509TrustManager.allowAllSSL();//调用

URL postUrl = new URL("https://open.t.qq.com/cgi-bin/request_token?"+params);

URL postUrl = new URL("http://www.bkjia.com"); 

HttpURLConnection con = (HttpURLConnection) postUrl.openConnection();

相关内容