Android應用中訪問HTTPS方式
HTTPS和HTTP的區別
一、https協議需要到ca申請證書,一般免費證書很少,需要交費。
二、http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
三、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
四、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。
第一種使用自定義證書
SSLSocketFactory.getSocketFactory() 使用自定義證書不被系統承認
第二種 直接從https://kyfw.12306.cn/otn/ 下載根證書 匯入應用中 驗證/** * 使用自定義證書並忽略驗證的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; } }
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 Studio中http請求方式
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的訪問。之前