1. 程式人生 > >Android應用中訪問HTTPS方式

Android應用中訪問HTTPS方式

HTTPS和HTTP的區別

一、https協議需要到ca申請證書,一般免費證書很少,需要交費。

二、http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。

三、http和https使用的是完全不同的連線方式,用的也不一樣,前者是80,後者是443。

四、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。

第一種使用自定義證書 

SSLSocketFactory.getSocketFactory() 使用自定義證書不被系統承認
	/**
	 * 使用自定義證書並忽略驗證的HTTPS連線方式
	 */
	public static void GetNetWork() {
		try {
			String path = "https://192.168.0.102:8443/123.html";

			BasicHttpParams params = new BasicHttpParams();
			HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
			HttpProtocolParams.setContentCharset(params,
					HTTP.DEFAULT_CONTENT_CHARSET);
			HttpProtocolParams.setUseExpectContinue(params, true);

			SSLSocketFactory.getSocketFactory().setHostnameVerifier(
					new AllowAllHostnameVerifier());

			SchemeRegistry schReg = new SchemeRegistry();

			schReg.register(new Scheme("http", PlainSocketFactory
					.getSocketFactory(), 80));
			// 出錯:因為使用了不被系統承認的自定義證書:No peer certificate 。

			// schReg.register(new Scheme("https",SSLSocketFactory.getSocketFactory(), 443));

			schReg.register(new Scheme("https", SSLTrustAllSocketFactory
					.getSocketFactory(), 443));
			ClientConnectionManager connMgr = new ThreadSafeClientConnManager(
					params, schReg);
			DefaultHttpClient client = new DefaultHttpClient(connMgr, params);

			HttpGet request = new HttpGet(path);

			HttpResponse httpResponse = client.execute(request);
			int responseCode = httpResponse.getStatusLine().getStatusCode();
			String message = httpResponse.getStatusLine().getReasonPhrase();
			HttpEntity entity = httpResponse.getEntity();
			if (responseCode == 200 && entity != null) {
				Log.e("log", entity.toString());
			}

		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public static class SSLTrustAllSocketFactory extends SSLSocketFactory {

		private static final String TAG = "SSLTrustAllSocketFactory";
		private SSLContext mCtx;

		public class SSLTrustAllManager implements X509TrustManager {

			@Override
			public void checkClientTrusted(X509Certificate[] arg0, String arg1)
					throws CertificateException {
			}

			@Override
			public void checkServerTrusted(X509Certificate[] arg0, String arg1)
					throws CertificateException {
			}

			@Override
			public X509Certificate[] getAcceptedIssuers() {
				return null;
			}

		}

		public SSLTrustAllSocketFactory(KeyStore truststore) throws Throwable {
			super(truststore);
			try {
				mCtx = SSLContext.getInstance("TLS");
				mCtx.init(null,
						new TrustManager[] { new SSLTrustAllManager() }, null);

				setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
			} catch (Exception ex) {
			}
		}

		@Override
		public Socket createSocket(Socket socket, String host, int port,
				boolean autoClose) throws IOException, UnknownHostException {
			return mCtx.getSocketFactory().createSocket(socket, host, port,
					autoClose);
		}

		@Override
		public Socket createSocket() throws IOException {
			return mCtx.getSocketFactory().createSocket();
		}

		public static SSLSocketFactory getSocketFactory() {
			try {
				KeyStore trustStore = KeyStore.getInstance(KeyStore
						.getDefaultType());
				trustStore.load(null, null);
				SSLSocketFactory factory = new SSLTrustAllSocketFactory(
						trustStore);
				return factory;
			} catch (Throwable e) {
				Log.d(TAG, e.getMessage());
				e.printStackTrace();
			}
			return null;
		}

	}
第二種  直接從https://kyfw.12306.cn/otn/ 下載根證書 匯入應用中 驗證 
public static void GetNetWork2(Context context) {
		try {
			String path = "https://kyfw.12306.cn/otn/";

			BasicHttpParams params = new BasicHttpParams();
			HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
			HttpProtocolParams.setContentCharset(params,
					HTTP.DEFAULT_CONTENT_CHARSET);
			HttpProtocolParams.setUseExpectContinue(params, true);

			SSLSocketFactory.getSocketFactory().setHostnameVerifier(
					new AllowAllHostnameVerifier());

			SchemeRegistry schReg = new SchemeRegistry();

			schReg.register(new Scheme("http", PlainSocketFactory
					.getSocketFactory(), 80));
			schReg.register(new Scheme("https", SSLCustomSocketFactory
					.getSocketFactory(context), 443));
			ClientConnectionManager connMgr = new ThreadSafeClientConnManager(
					params, schReg);
			DefaultHttpClient client = new DefaultHttpClient(connMgr, params);

			HttpGet request = new HttpGet(path);

			HttpResponse httpResponse = client.execute(request);
			int responseCode = httpResponse.getStatusLine().getStatusCode();
			String message = httpResponse.getStatusLine().getReasonPhrase();
			HttpEntity entity = httpResponse.getEntity();
			if (responseCode == 200 && entity != null) {
				Log.e("log", entity.toString());
			}

		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public static class SSLCustomSocketFactory extends SSLSocketFactory {
		private static final String TAG = "SSLCustomSocketFactory";

		private static final String KEY_PASS = "123456";

		public SSLCustomSocketFactory(KeyStore trustStore) throws Throwable {
			super(trustStore);
		}

		public static SSLCustomSocketFactory getSocketFactory(Context context) {
			InputStream ins = null;
			KeyStore trustStore;
			try {
				ins = context.getResources().openRawResource(R.raw.srca);

				trustStore = KeyStore.getInstance(KeyStore.getDefaultType());

				trustStore.load(null);
				CertificateFactory certificateFactory = CertificateFactory
						.getInstance("X.509");
				String certificateAlias = Integer.toString(2);
				trustStore.setCertificateEntry(certificateAlias,
						certificateFactory.generateCertificate(ins));
				ins.close();

				SSLCustomSocketFactory factory = new SSLCustomSocketFactory(
						trustStore);
				return factory;
			} catch (KeyStoreException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (CertificateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchAlgorithmException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (Throwable e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				if(ins!=null){
					try {
						ins.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
				}
			}
			return null;
		}
	}

不論是瀏覽器匯出,還是伺服器端獲得,都是公鑰證書,有兩種格式:純文字的.crt格式或是二進位制的.cer格式。兩種都可以用。

然後,你如果需要一個特定版本的JCE Provider,然後在這個目錄下執行以下命令: keytool -importcert -v -trustcacerts -alias cert12306 -file srca.cer -keystore cert12306.bks -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-jdk15on-148.jarr -storepass 123456 

生成cert12306.bks檔案 匯入應用中

public static void GetNetWork3(Context context) {
		try {
			String path = "https://kyfw.12306.cn/otn/";

			BasicHttpParams params = new BasicHttpParams();
			HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
			HttpProtocolParams.setContentCharset(params,
					HTTP.DEFAULT_CONTENT_CHARSET);
			HttpProtocolParams.setUseExpectContinue(params, true);

			SSLSocketFactory.getSocketFactory().setHostnameVerifier(
					new AllowAllHostnameVerifier());

			SchemeRegistry schReg = new SchemeRegistry();

			schReg.register(new Scheme("http", PlainSocketFactory
					.getSocketFactory(), 80));
			schReg.register(new Scheme("https", SSLCustomSocketFactory2
					.getSocketFactory(context), 443));
			ClientConnectionManager connMgr = new ThreadSafeClientConnManager(
					params, schReg);
			DefaultHttpClient client = new DefaultHttpClient(connMgr, params);

			HttpGet request = new HttpGet(path);

			HttpResponse httpResponse = client.execute(request);
			int responseCode = httpResponse.getStatusLine().getStatusCode();
			String message = httpResponse.getStatusLine().getReasonPhrase();
			HttpEntity entity = httpResponse.getEntity();
			if (responseCode == 200 && entity != null) {
				Log.e("log", entity.toString());
			}

		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public static class SSLCustomSocketFactory2 extends SSLSocketFactory {
		private static final String TAG = "SSLCustomSocketFactory";

		private static final String KEY_PASS = "123456";

		public SSLCustomSocketFactory2(KeyStore trustStore) throws Throwable {
			super(trustStore);
		}

		public static SSLCustomSocketFactory2 getSocketFactory(Context context) {
			InputStream ins = null;
			KeyStore trustStore;
			try {
				ins = context.getResources().openRawResource(R.raw.cert12306);

				trustStore = KeyStore.getInstance(KeyStore.getDefaultType());

				trustStore.load(ins, KEY_PASS.toCharArray());

		SSLCustomSocketFactory2 factory = new SSLCustomSocketFactory2(
						trustStore);
				return factory;
			} catch (KeyStoreException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (CertificateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchAlgorithmException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (Throwable e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				if(ins!=null){
					try {
						ins.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
				}
			}
			return null;
		}
	}


相關推薦

Android應用訪問HTTPS方式

HTTPS和HTTP的區別 一、https協議需要到ca申請證書,一般免費證書很少,需要交費。 二、http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。 三、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。 四、htt

Android應用使用自定義證書的HTTPS連線(下)

因為這部分才是本文的重點,要說得詳細一點,所以單獨做成一篇來說。安全地使用自定義證書的HTTPS連線方式終極解決方案是:把證書編譯到應用中去,由應用自己來驗證證書。生成KeyStore要驗證自定義證書,首先要把證書編譯到應用中去,這需要JSSE提供的keytool工具來生成K

Android應用使用自定義證書的HTTPS連線(上)

對於初次接觸https有一定的幫助,本文屬於轉載篇。 原文地址:http://blog.csdn.net/raptor/article/details/18896375 前言 由於移動裝置使用的網路環境各種各樣,而且常常接入不安全的公共WIFI——如果你對公共WIFI

unity3d開發的android應用增加AD系統的詳細步驟

查看 發的 b- sset @override 大小 代碼 nac cal unity3d開發的android應用中增加AD系統的詳細步驟 博客分類: Unity3d unity3d Unity3d已經支持android,怎樣在程序裏增加admob?

Android應用程序訪問linux驅動第一步:實現並測試Linux驅動

sizeof 屬性文件 rup sla 沒有 lov /dev/ art kmalloc 一直都想親自做一次使用android應用程序訪問Linux內核驅動的嘗試,但總是沒能做到。最近抽出時間,下決心重新嘗試一次。嘗試的開始當然是先寫一個Linux內核驅動了。 我希望

Android應用使用哪個WebSocket套件?

我Google 了一下,找到很多個套件可以使用。 目前這套件在 2017-10-27 的星星數目: 4673 目前這套件在 2017-10-27 的星星數目: 698 目前這套件在 2017-10-27 的星星數目: 3317 上面 3個,照星星數來排,應該用 4000星的,我試了一下,範例沒辦

Android應用TextView跑馬燈效果

往往有很多時候我們所使用的TextView能顯示的內容字數是有限的,有時當我們要設定的內容長度過長時,我們的UI頁面就會出現一些不和諧的現象。 處理方法(很少有人把...放在前面的吧…^ v ^): 1,尾部(...)處理      android:ellipsize=

android應用為按鍵新增聲音

    soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);     soundPoolMap = new HashMap<Integer, Integer>();       soundPoolMap.put(1, soun

Android應用使用百度地圖API並新增標註(一)

網上一些資料這種的內容已經過時了,這裡是最新的內容,如果哪裡不對,請吐槽。。。 1)下載百度地圖移動版API(Android)開發包       要在Android應用中使用百度地圖API,就需要在工程中引用百度地圖API開發包,這個開發包包含兩個檔案: 2)申請A

喚醒鎖: 檢測 Android* 應用的 No-Sleep(無法進入睡眠)問題

如果 Android* 應用使用喚醒鎖不當,將會顯著增加電池耗電量。 在本文中,我們將介紹一些提示和技巧,幫助您瞭解如何確認與誤用喚醒鎖有關的 No Sleep 漏洞。 1. 介紹 限制電池耗電量對智慧手機非常有必要。 為了獲得最大的自主性,Android 的作業系統設計可在檢測到系統上無使用者活動時

Android Studio 兩種方式定製自己的程式碼註釋頭

在使用Android Studio的時候,每當新建立一個Java檔案的時候,系統會自動幫我們生成一個檔案註釋頭,類似 /*** *Create By SomeOne  On 2017/03/30  *

Android應用使用百度地圖API定位自己的位置(二)

百度地圖SDK為開發者們提供瞭如下型別的地圖覆蓋物: 我的位置圖層(MyLocationOverlay):用於顯示使用者當前位置的圖層(支援自定義位置圖示); Poi搜尋結果圖層(PoiOverlay):用於顯示興趣點搜尋結果的圖層; 路線圖層(RouteOve

Android應用開啟百度地圖、高德地圖、網頁版百度地圖

1.需求 在Android應用中開啟百度地圖或者高德地圖進行路線規劃,如果沒有安裝則開啟網頁百度地圖進行路線規劃。 2.API 2.1 開啟百度地圖應用 開啟文件可以看到功能還是很多的,這裡只介紹 公交、駕車、導航、步行和騎行導航 注:

Android 應用使用資料庫

概述 在 Android 程式碼中建立和修改 SQLite 資料庫,我們可以參考 Android 文件 Save data using SQLite,我們在 Android 中需要採取兩個基本步驟來設定 SQLite 就可以和資料庫互動了。如下所示: De

Android開發學習之路--在Android應用愉快地寫C/C++程式碼

1 前言 一直想在android層面寫c程序,然後java可以與c程序互動,以前在android原始碼中想玩就可以直接在init.rc中加上交叉編譯好的c程序就可以了,而在ide中,也就是ndk編譯後各種許可權問題就有點不得而知了。花了幾天時間研究實踐,也終於

Android應用去掉標題欄方法總結(Eclipse+Android Studio)

Eclipse 1.在程式程式碼中實現 需要注意的是: this.requestWindowFeature(Window.FEATURE_NO_TITLE);

android應用不響應按鍵事件(俗稱攔截按鍵)

在應用中重寫 dispatchKeyEvent函式:例項中為遮蔽KEYCODE_ENTER事件 public boolean dispatchKeyEvent(KeyEvent event) { int keyCode = event.getKeyCode();if(K

Android Studiohttp請求方式

import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View;

Android應用程式訪問linux驅動第三步:實現並向系統註冊Service

前面兩篇部落格記錄了實現Linux驅動和使用HAL層訪問Linux驅動的程式碼,我們分別對這兩部分做了測試,他們都正常工作。有了前面的基礎,我們就可以實現service層了,我們想系統註冊我們自己的service,在service中訪問HAL層,在HAL層中訪問

kubernetes使用traefik的https方式訪問web應用

traefik https k8s 背景之前的文章中,我已經利用kubernetes的traefik服務作為入口,訪問了tomcat的相關服務,但之前的文章是通過http的方式來訪問的。在現實應用中,為了安全考慮,肯定有https訪問的需求,這裏我們就通過traefik來實現https的訪問。之前