android本地搭建Https本地服務(wù)器

在本地搭建服務(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訪問了,注意這證書是自己生成的所以需要同意加載才行,默認認為是不安全的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容