1、https的握手協議: http://blog.csdn.net/clh604/article/details/22179907
二、證書的概念:http://blog.csdn.net/sealyao/article/details/5761747
三、詳細解釋證書:http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html#!comments
數字證書則是由證書認證機構(CA)對證書申請者真實身份驗證以後,用CA的根證書對申請人的一些基本信息以及申請人的公鑰進行簽名(至關於加蓋發證書機 構的公章)後造成的一個數字文件。CA完成簽發證書後,會將證書發佈在CA的證書庫(目錄服務器)中,任何人均可以查詢和下載,所以數字證書和公鑰同樣是公開的。實際上,數字證書就是通過CA認證過的公鑰。
通常的數字證書產品的主題一般含有以下字段: 公用名稱 (Common Name) 簡稱:CN 字段,對於 SSL 證書,通常爲網站域名;而對於代碼簽名證書則爲申請單位名稱;而對於客戶端證書則爲證書申請者的姓名; 單位名稱 (Organization Name) :簡稱:O 字段,對於 SSL 證書,通常爲網站域名;而對於代碼簽名證書則爲申請單位名稱;而對於客戶端單位證書則爲證書申請者所在單位名稱; 證書申請單位所在地: 所在城市 (Locality) 簡稱:L 字段 所在省份 (State/Provice) 簡稱:S 字段 所在國家 (Country) 簡稱:C 字段,只能是國家字母縮寫,如中國:CN 其餘一些字段: 電子郵件 (Email) 簡稱:E 字段 多個姓名字段 簡稱:G 字段 介紹:Description 字段 電話號碼:Phone 字段,格式要求 + 國家區號 城市區號 電話號碼,如: +86 732 88888888 地址:STREET 字段 郵政編碼:PostalCode 字段 顯示其餘內容 簡稱:OU 字段
android 上進行 https開發:
一、首先須要服務器提供x509格式的server.crt證書文件。
二、下載一個bcprov-ext-jdk15on-152.jar 下載地址http://www.bouncycastle.org/latest_releases.html
三、將該jar放置到C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext地址
四、keytool -import -alias serverkey -file server.crt -keystore tclient.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
將crt 轉換爲 bks文件(android環境必須的)
參考連接:http://frank-zhu.github.io/android/2014/12/26/android-https-ssl/
private static final String KEY_STORE_TYPE_BKS = "bks";//證書類型 固定值
private static final String KEY_STORE_TRUST_PASSWORD = "123456";//客戶端證書庫密碼
private static SSLContext getSSLContext(Context context) { try { // 客戶端信任的服務器端證書 KeyStore trustStore = KeyStore.getInstance(KEY_STORE_TYPE_BKS); InputStream tsIn = context.getResources().openRawResource(R.raw.tclient); try { trustStore.load(tsIn, KEY_STORE_TRUST_PASSWORD.toCharArray()); } catch (Exception e) { e.printStackTrace(); } finally { try { tsIn.close(); } catch (Exception ignore) { } } SSLContext sslContext = SSLContext.getInstance("TLS"); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trustStore); sslContext.init(null, trustManagerFactory.getTrustManagers(), null); return sslContext; } catch (Exception e) { Log.e("tag", e.getMessage(), e); } return null; }
SSLContext sslContext = getSSLContext(Env.getContext());
conn = (HttpsURLConnection) url.openConnection();
((HttpsURLConnection)conn).setSSLSocketFactory(sslContext.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new TrustAllHostnameVerifier());
數字證書包含的內容:一、證書頒發機構;二、使用機構;三、公鑰;四、有效期;五、簽名算法;六、簽名hash算法;七、指紋算法;八、指紋A、證書生成過程: 證書的生成原理:公司ABC 本身生成一對公鑰、私鑰以及對應的加密算法,還有公司相關信息,提供給證書頒發機構CA。CA根據提供的信息生成證書(或者本身生成,這裏不是重點) 指紋算法: 使用指紋算法(sha1或者是md5)對證書全文提取指紋(簡單點就是計算對應的hash值)。PS:指紋的目的是校驗證書是否被修改,但指紋自己也能夠被修改;例如,修改證書以後,用對應的指紋算法從新提取指紋。簽名Hash算法: 爲了解決上述問題,CA機構用本身的私鑰,使用證書中指定的簽名Hash算法,對指紋進行加密。PS:這樣其餘人由於不知道,CA機構的私鑰,就沒法對修改後證書的指紋進行再次簽名B、證書的驗證過程一、提取證書發佈機構;PS:這個是微軟、gongle集成在系統中的,他們選擇的一些公信力高的機構的證書集成到系統中。二、從系統中查找該CA機構的證書,而且提取公鑰,使用公鑰對指紋進行解密,對應的簽名算法從ABC公司的證書中提取;三、從ABC公司的證書中提取指紋算法,重新對證書進行指紋提取,而後和上一步提取的指紋進行對比,若是相同表示沒有被修改。客戶端拿到證書以後,簽名算法: 客戶端從服務器獲取公司ABC的簽名證書以後,從中提取公鑰和簽名算法,對須要發送的明文,使用公鑰和簽名算法進行加密; 服務器端接收到密文後,使用私鑰對密文解密; 服務器發送的消息,使用私鑰加密,不能保證不可見性,因此後續會和客戶端協商選擇一個對稱加密算法來加密數據傳輸。證書鏈: 公司ABC的證書須要CA機構的證書進行驗證,CA機構的證書是收到微軟信任的,能夠不用驗證。可是其中可能存在多級驗證好比,ABC的證書須要CA驗證,CA須要BA驗證,AA纔是微軟信任的,無需驗證的證書。這樣就造成了一個信任鏈條 另外經常使用的RSA爲非對稱加密算法,而且公鑰、私鑰均可以用來加密、解密