国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

小白一步一步使用HTTPS

2019-11-06 10:05:25
字體:
供稿:網(wǎng)友

由于2017年初開始禁止未使用https的應(yīng)用上架appstore,領(lǐng)導(dǎo)們開始考慮在我們的應(yīng)用中使用https,這讓我很頭疼,以前聽到過https,用httpwatch抓知乎、微信的包的時候都看到這些應(yīng)用使用的都是https,對https感覺很熟悉,其實是一知半解的,這下要在應(yīng)用中使用,看來必須要好好研究下了。

  下面是研究https在簡書上搜索到的幾篇優(yōu)秀文章:

   http://www.jianshu.com/p/ce1557c1868d;

   http://www.jianshu.com/p/d79b37216558;

   http://www.jianshu.com/p/4494774963a9;

   http://www.jianshu.com/p/7cdd2324f639;

   要使用HTTPS肯定要知道一些概念,從上面幾篇優(yōu)秀文章里找出來幾個必須要了解的概念:

   1.HTTP:一種明文傳輸協(xié)議,交互過程以及數(shù)據(jù)傳輸都沒有進(jìn)行加密,通信雙方?jīng)]有進(jìn)行身份驗證,通信過程容易遭到劫持、篡改的安全問題。

   2.SSL:安全套接層。

   3.HTTPS:只是一種在HTTP協(xié)議的基礎(chǔ)上加了一層SSL的封裝,之后具有了以下三個特征:

                                                                                                                                                                  數(shù)據(jù)完整性:數(shù)據(jù)傳輸經(jīng)過完整性校驗

                                                                                                                                                                  數(shù)據(jù)隱私性:數(shù)據(jù)經(jīng)過加密

                                                                                                                                                                  身份認(rèn)證:第三方不能偽造客戶端或者服務(wù)端的身份

   4.對稱加密:采用單密碼加密,同一個密鑰可以用來加密,也可以用來解密,簡單理解就是加解密都是用的同一個秘鑰。特點:體量小,算法公開,加密效率特別高。

   5.非對稱加密:有2個秘鑰,一個是公開的秘鑰,一個是私有密鑰,這兩個是一對,互相配合加密和解密,公鑰加密用私鑰解密,私鑰加密公鑰解密。特點:速度慢,但是加          密很可靠

   6.CA 證書:其實就是XXX機(jī)構(gòu)頒發(fā)的一個包含公鑰和密鑰的證書。

    

    下面用一張我畫的圖來理解下HTTPS的工作原理:

                                              

         

             第一步:client向service發(fā)送一條請求,告訴service,client支持哪種算法(比如:對稱加密算法有DES,RC5,密鑰交換算法有RSA和DH,摘要算法有md5和SHA等)

             第二步:service接收到client的消息后,分析之后,選擇一種client支持的算法,把證書發(fā)送給client的,這個證書里面包含了一些證書的基本信息(例如:失效時間,名稱,域名信息,公鑰等)

             第三步:client接收到信息后,利用本地存在的數(shù)字證書對service的證書進(jìn)行驗證,如果驗證失敗,會彈出一個提示框來顯示錯誤信息,驗證通過,生成一個隨機(jī)數(shù),然后證書中的公鑰進(jìn)行加密,發(fā)送給service

            第四步:service接收到加密的隨機(jī)數(shù)之后,用公鑰進(jìn)行解密,取出隨機(jī)數(shù),然后把這個隨機(jī)數(shù)當(dāng)做密鑰對要加密的內(nèi)容進(jìn)行對稱加密,發(fā)送給client

            第五步:client接收到service發(fā)送的密文,用之前保存的隨機(jī)數(shù)作為密鑰進(jìn)行解密,還原密文

            第六步:之后client和service進(jìn)行數(shù)據(jù)交互,利用那個隨機(jī)數(shù)作為密鑰進(jìn)行加解密

         到這里對很多https的概念還是很迷茫,比如數(shù)字認(rèn)證識什么東東,在第二步的時候client是怎么驗證service的證書?,service怎么對client的身份做校驗,然后就反反復(fù)復(fù)又查資料,上面的問題都可以在下面的博客中找到

            http://www.cnblogs.com/P_Chou/archive/2010/12/27/https-ssl-certification.html

  現(xiàn)在應(yīng)該能到得到一個結(jié)論,證書可以由國際上公認(rèn)的證書機(jī)構(gòu)頒發(fā),一般客戶端的證書驗證的應(yīng)用程序?qū)@些機(jī)構(gòu)頒發(fā)的證書完全信任,不過一般情況下,我們會讓客戶端程序安裝我們服務(wù)端的根證書,保證客戶端可以信任我們的證書。

  好了,廢話不多說,看代碼        

/** * 初始化有證書的SSLContext * <p> * client.cer 是后臺申請?zhí)峁┑模话荑€信息 * * @param context * @return * @throws NoSuchAlgorithmException * @throws IOException * @throws CertificateException * @throws KeyStoreException * @throws UnrecoverableKeyException * @throws KeyManagementException */public static SSLContext getSSLContextWithCer(Context context) throws NoSuchAlgorithmException, IOException, CertificateException, KeyStoreException, UnrecoverableKeyException, KeyManagementException {    //實例化SSLContext    SSLContext sslContext = SSLContext.getInstance("SSL");    // 從assets中加載證書,在HTTPS通訊中最常用的是cer/crt和pem    InputStream inputStream = context.getAssets().open("client.cer");    // 證書工廠    CertificateFactory cerFactory = CertificateFactory.getInstance("X.509");    Certificate cer = cerFactory.generateCertificate(inputStream);    // 密鑰庫    KeyStore keyStory = KeyStore.getInstance("PKCS12");    //沒有密鑰    keyStory.load(null, null);    // 加載證書到密鑰庫中    keyStory.setCertificateEntry("ass", cer);    // 密鑰管理器    KeyManagerFactory kMFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());    kMFactory.init(keyStory, null);    // 信任管理器    TrustManagerFactory tmFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());    tmFactory.init(keyStory);    //初始化sslContext    sslContext.init(kMFactory.getKeyManagers(), tmFactory.getTrustManagers(), new SecureRandom());    inputStream.close();    return sslContext;}

           

/** * 獲取SSLContext * * @return * @throws NoSuchAlgorithmException * @throws KeyManagementException */public static SSLContext getSSLContextWithoutCer() throws NoSuchAlgorithmException, KeyManagementException {    // 實例化SSLContext    SSLContext sslContext = SSLContext.getInstance("SSL");    sslContext.init(null, new TrustManager[]{trustManagers}, new SecureRandom());    return sslContext;}/** * 自定義信任管理器 */PRivate static TrustManager trustManagers = new X509TrustManager() {    @Override    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {    }    @Override    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {    }    @Override    public X509Certificate[] getAcceptedIssuers() {        return new X509Certificate[0];    }};//驗證主機(jī)名public static HostnameVerifier hostnameVerifier = new HostnameVerifier() {    @Override    public boolean verify(String hostname, SSLsession session) {        // TODO Auto-generated method stub        return true;    }};

 

       


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 法库县| 洪洞县| 云浮市| 离岛区| 康定县| 锦州市| 旺苍县| 商都县| 凯里市| 会理县| 玉树县| 东丽区| 中西区| 贡觉县| 驻马店市| 昌宁县| 五家渠市| 长治市| 延寿县| 海盐县| 临潭县| 开封县| 门源| 四子王旗| 团风县| 进贤县| 柘城县| 焦作市| 永川市| 定远县| 香格里拉县| 贡觉县| 普兰店市| 常德市| 高阳县| 祁东县| 罗源县| 天祝| 纳雍县| 班玛县| 岗巴县|