1、https的握手協議: http://blog.csdn.net/clh604/article/details/22179907
2、證書的概念:http://blog.csdn.net/sealyao/article/details/5761747
3、詳細解釋證書: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開發:
1、首先需要服務器提供x509格式的server.crt證書文件。
2、下載一個bcprov-ext-jdk15on-152.jar 下載地址http://www.bouncycastle.org/latest_releases.html
3、將該jar放置到C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext地址
4、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());
數字證書包含的內容:1、證書頒發機構;2、使用機構;3、公鑰;4、有效期;5、簽名算法;6、簽名hash算法;7、指紋算法;8、指紋
A、證書生成過程:
證書的生成原理:公司ABC 自己生成一對公鑰、私鑰以及對應的加密算法,還有公司相關信息,提供給證書頒發機構CA。CA根據提供的信息生成證書(或者自己生成,這里不是重點)
指紋算法:
使用指紋算法(sha1或者是md5)對證書全文提取指紋(簡單點就是計算對應的hash值)。PS:指紋的目的是校驗證書是否被修改,但指紋本身也可以被修改;例如,修改證書之后,用對應的指紋算法重新提取指紋。
簽名Hash算法:
為了解決上述問題,CA機構用自己的私鑰,使用證書中指定的簽名Hash算法,對指紋進行加密。PS:這樣其他人因為不知道,CA機構的私鑰,就無法對修改后證書的指紋進行再次簽名
B、證書的驗證過程
1、提取證書發布機構;PS:這個是微軟、gongle集成在系統中的,他們選擇的一些公信力高的機構的證書集成到系統中。
2、從系統中查找該CA機構的證書,並且提取公鑰,使用公鑰對指紋進行解密,對應的簽名算法從ABC公司的證書中提取;
3、從ABC公司的證書中提取指紋算法,從新對證書進行指紋提取,然后和上一步提取的指紋進行對比,如果相同表示沒有被修改。
客戶端拿到證書之后,
簽名算法:
客戶端從服務器獲取公司ABC的簽名證書之后,從中提取公鑰和簽名算法,對需要發送的明文,使用公鑰和簽名算法進行加密;
服務器端接收到密文后,使用私鑰對密文解密;
服務器發送的消息,使用私鑰加密,不能保證不可見性,所以后續會和客戶端協商選擇一個對稱加密算法來加密數據傳輸。
證書鏈:
公司ABC的證書需要CA機構的證書進行驗證,CA機構的證書是收到微軟信任的,可以不用驗證。但是其中可能存在多級驗證比如,ABC的證書需要CA驗證,CA需要BA驗證,AA才是微軟信任的,無需驗證的證書。這樣就形成了一個信任鏈條
另外常用的RSA為非對稱加密算法,並且公鑰、私鑰都可以用來加密、解密