歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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.linuxidc.com"); 

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

Copyright © Linux教程網 All Rights Reserved