1. 程式人生 > >Android中使用https(HTTP+SSL)訪問伺服器

Android中使用https(HTTP+SSL)訪問伺服器

之前做網路請求一直都是用Http請求來和伺服器互動,一直聽說過Https不過一直沒用過,所以今天決定好好研究一下,一把鼻涕一把淚啊,結果發現……….哎,不說了,說多了都是淚;這裡記錄一下android怎麼使用https和伺服器互交。

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。

  • 首先第一步(生成證書)

    1.0,生成服務端的證書:
    開啟cmd命令列視窗,執行:(test是證書名字)
    keytool -genkey -alias test -keystore test.jks(test.jks這個需要儲存下來在配置tomcat伺服器中需要使用)

    1.1,把證書中的金鑰匯出:
    keytool -exportcert -alias test -file test.cert -keystore test.jks

    1.2,生成android端的證書:
    在坑爹的Android 要求要BC證書,而Java的keytool本身不提供BKS格式,因此要自己手動配置。
    配置:
    1.2.1:先到http://www.bouncycastle.org/latest_releases.html這裡去下載一個工具包bcprov-ext-jdk15on-151.jar(這個工具包有相對應的jdk版本)
    1.2.2:把這個jar包複製到
    C:\Program Files\Java\jdk1.6.0_43\jre\lib\ext\
    1.2.3:配置bcprov(jdk\jre\lib\security\目錄中找到 java.security 在內容增加一行security.provider.11 =org.bouncycastle.jce.provider.BouncyCastleProvider )
    1.2.4:使用命令生成證書 keytool
    -importcert -keystore test.bks -file test.cert-storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider

    注意:以上操作如果沒有設定路徑,則所有生成好的檔案都在C:\使用者\下面可以找到。

上面已經把需要的證書以及準備好,那麼就可以開始android端的程式碼書寫了

  • Android端
  private static DefaultHttpClient getDefaultHttpClient(){
        if(client==null){
            HttpParams params=new BasicHttpParams();
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(params
, "UTF-8"); HttpProtocolParams.setUserAgent(params, AGENT_INFO); ConnManagerParams.setTimeout(params, 5000); SchemeRegistry registry=new SchemeRegistry(); //讓請求支援http 和https兩種模式 registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory( ), 80)); //系統標準的SSLSocketFactory.getSocketFactory() //新增證書 registry.register(new Scheme("https",SSLTrust.getSocketFactory1(mcontext), 443)); ThreadSafeClientConnManager conMgr = new ThreadSafeClientConnManager(params, registry); client = new DefaultHttpClient(conMgr,params); } return client; } 上面的SSLTrust就是我們自己定義的一個SSLSocketFactory,SSLTrust繼承於SSLSocketFactory: public SSLTrust(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(truststore); // TODO Auto-generated constructor stub s_context=SSLContext.getInstance("TLS"); s_context.init(null, new TrustManager[]{new SSLTrustAllManager()}, null); //設定主機過濾,允許所有的 setHostnameVerifier( SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); } 重寫createSocket方法 @Override public Socket createSocket(Socket socket, String host, int port,boolean autoClose) throws IOException, UnknownHostException { // TODO Auto-generated method stub return s_context.getSocketFactory() .createSocket(socket, host, port, autoClose); } 然後在提供一個對外的方法: public static SSLSocketFactory getSocketFactory1( Context context){ try { KeyStore keystore=KeyStore .getInstance(KeyStore.getDefaultType()); InputStream keyStroreInputStream =context.getAssets().open("test.bks"); //公鑰 keystore.load(keyStroreInputStream, pass.toCharArray()); SSLTrust trust=new SSLTrust(keystore); return trust; } catch (KeyStoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (KeyManagementException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnrecoverableKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (CertificateException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }

以上就是Android客戶端,已經配置完畢。

  • 伺服器端配置https的ssl證書
    這裡以Tomcat為例。
    找到Tomcat的配置檔案(E:\Tomcat\Tomcat 6.0\conf\server.xml);
    然後開啟檔案,把已經註釋的這段程式碼給恢復,也就是去掉註釋
    去掉註釋以後,在加上我們的金鑰truststoreFile,keystoreFile:
  <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
               truststoreFile="E:\\secry\\test.jks" 
               truststorePass="123456"
               keystoreFile="E:\\secry\\test.jks" 
               keystorePass="123456"/>

好了 到這裡就基本完成了,這證書者玩意是要錢的要money的,我們自己生成測試的沒什麼用,其實12306也是用的自己的證書,當你用ie去訪問12306的時候,瀏覽器會提示你12306是一個危險的網站,不推薦繼續訪問,當然你可以點選繼續訪問。
最後附上測試demo:http://download.csdn.net/detail/leifengpeng/8704155