在Https協議傳輸的過程中,如何確認接收方是真正的服務器端,而不是黑客呢? SSL證書可以解決這個問題。
SSL(Secure Socket Layer,安全套接字層):1994年爲 Netscape 所研發,SSL 協議位於 TCP/IP 協議與各種應用層協議之間,爲數據通訊提供安全支持。
TLS(Transport Layer Security,傳輸層安全):其前身是 SSL,它最初的幾個版本(SSL 1.0、SSL 2.0、SSL 3.0)由網景公司開發,1999年從 3.1 開始被 IETF 標準化並改名,發展至今已經有 TLS 1.0、TLS 1.1、TLS 1.2 三個版本。SSL3.0和TLS1.0由於存在安全漏洞,已經很少被使用到。TLS 1.3 改動會比較大,目前還在草案階段,目前使用最廣泛的是TLS 1.1、TLS 1.2。
第一部分 下面就來詳細分析一下Https協議的前面兩個步驟:
如上圖所示,在第 ② 步時服務器發送了一個SSL證書給客戶端,SSL 證書中包含的具體內容有:
(1)證書的發佈機構CA
(2)證書的有效期
(3)公鑰
(4)證書所有者
(5)簽名
………
於是,客戶端在接受到服務端發來的SSL證書時,會對證書的真僞進行校驗,以瀏覽器爲例說明如下:
(1)首先瀏覽器讀取證書中的證書所有者、有效期等信息進行一一校驗
(2)瀏覽器開始查找操作系統中已內置的受信任的證書發佈機構CA,與服務器發來的證書中的頒發者CA比對,用於校驗證書是否爲合法機構頒發
(3)如果找不到,瀏覽器就會報錯,說明服務器發來的證書是不可信任的。
(4)如果找到,那麼瀏覽器就會從操作系統中取出 頒發者CA 的公鑰,然後對服務器發來的證書裏面的簽名進行解密
(5)瀏覽器使用相同的hash算法計算出服務器發來的證書的hash值,將這個計算的hash值與證書中籤名做對比
(6)對比結果一致,則證明服務器發來的證書合法,沒有被冒充
(7)此時瀏覽器就可以讀取證書中的公鑰,用於後續加密了
第二部分 這裏提到的簽名,一般就是一串字符串的hash值,對於Java中的hash算法,使用MD5或者SHA。這裏說明一下MD5算法。
算法例子:
public class MD5Encry {
public static String md5Entye(String str) throws Exception{
MessageDigest md5= MessageDigest.getInstance("MD5");
BASE64Encoder base64en = new BASE64Encoder();
//加密後的字符串
String newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));
return newstr;
}
}
測試代碼:
public static void testMD5(){
String str = "123456";
System.out.println("before entye:"+str);
String afterEntype;
try {
afterEntype = MD5Encry.md5Entye(str);
System.out.println("afterEntype:"+afterEntype);
str = "0123456789";
System.out.println("change the str:"+str);
System.out.println("change afterEntype:"+MD5Encry.md5Entye(str));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
測試結果如下:
before entye:123456
afterEntype:4QrcOUm6Wau+VuBX8g+IPg==
change the str:0123456789
change afterEntype:eB5eJF1ptWaXm4bijSPyxw==
不同的值,計算出來的簽名一定不一樣。
第三部分 總結
所以通過發送SSL證書的形式,既解決了公鑰獲取問題,又解決了黑客冒充問題,一箭雙鵰。HTTPS加密過程也就此形成。
所以相比HTTP,HTTPS 傳輸更加安全
(1) 所有信息都是加密傳播,黑客無法竊聽。
(2) 具有校驗機制,一旦被篡改,通信雙方會立刻發現。
(3) 配備身份證書,防止身份被冒充。