在本地搭建服務(wù)器有什么用呢?
這個我只能說我現(xiàn)在用著了,需要加密HLS視頻,具體的應(yīng)用場景可以很多。
搭建普通的一個http服務(wù)器好搞,https怎么做呢
- 首先我們這次使用的是一個比較好的三方的框架NanoHTTPD
- 但是悲劇的是他并沒有實現(xiàn)android本地https具體的例子。
首先我們知道https需要證書,怎么生成呢,
使用keytool生成證書keytool是JDK提供的管理加密密鑰、X.509證書鏈和可信證書密鑰庫的簡便工具。安卓開發(fā)必定安裝了JDK并且一般都會配置好環(huán)境變量,所以你可以直接在終端或DOC窗口輸入keytool命令來查看幫助。
-
生成密鑰對
keytool -genkey -alias server -keyalg RSA -keystore server.jks -alias后面跟的是唯一別名,-keystore后面填保存秘鑰對的文件路徑還可以添加一個-validity 天數(shù)聲明有效期
需要注意的地方:執(zhí)行命令之后第一個問題讓你輸入名字的地方最好設(shè)置成域名,比如這樣baidu.com或者這樣localhost,反正匹配你要調(diào)式的域名就對了,當(dāng)然,如果你在安卓上調(diào)試,那么本地地址可能用不了。
- 導(dǎo)出證書
上面生成了服務(wù)端使用的密鑰對,現(xiàn)在可以通過它生成證書給客戶端使用
keytool -export -alias server -storepass 123456 -keystore server.jks -file server.cer
這個證書是服務(wù)端使用的我們客戶端使用的kbs
- 生成客戶端密鑰
keytool -genkey -alias android -keyalg RSA -keystore android.jks
剛才生成了客戶端的密鑰庫android.jks。但是安卓默認是不支持jks格式的!比較常規(guī)的解決方式是用Portecle工具將它轉(zhuǎn)換成bks文件。
下載完之后解壓并在目錄下運行命令:java -jar portecle.jar或者也可以直接雙擊它打開
運行之后就會出來UI界面,用它打開android.jks然后選菜單 Tools –> Change Keystore Type –> BKS 在彈出框輸入密碼進行轉(zhuǎn)換,最后別忘記選菜單 File –> Save Keystore As 將它另存為android.kbs(名字隨意)
- 生成kbs文件之后,把它放到安卓的目錄下assets或者raw。(注意這里有個坑,這個kbs文件我們是不能用的,我們需要裝換成kbsv-1)v-1,還是用上面的工具轉(zhuǎn)換
生成之后怎么做呢
try {
AssetManager am = getAssets();
//InputStream ins1 = am.open("server.cer");
InputStream ins2 = am.open("android.kbs");
MyHttpd myHttpd = new MyHttpd();
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(ins2, null);
//讀取證書,注意這里的密碼必須設(shè)置
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, "android".toCharArray());
myHttpd.makeSecure(NanoHTTPD.makeSSLSocketFactory(keyStore, keyManagerFactory), null);
myHttpd.start(NanoHTTPD.SOCKET_READ_TIMEOUT, false);
} catch (IOException e) {
Log.e("IOException", "Couldn't start server:\n" + e.getMessage());
} catch (NumberFormatException e) {
Log.e("NumberFormatException", e.getMessage());
} catch (KeyStoreException | NoSuchAlgorithmException e) {
Log.e("HTTPSException", "HTTPS certificate error:\n " + e.getMessage());
} catch (UnrecoverableKeyException e) {
Log.e("UnrecoverableKeyException", "UnrecoverableKeyException" + e.getMessage());
} catch (CertificateException e) {
e.printStackTrace();
}
這樣我們就可以在本地使用https訪問了,注意這證書是自己生成的所以需要同意加載才行,默認認為是不安全的