HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密
的詳細內(nèi)容就需要SSL
SSL協(xié)議的握手過程
SSL 協(xié)議既用到了公鑰加密技術(shù)又用到了對稱加密技術(shù),對稱加密技術(shù)雖然比公鑰加密技術(shù)的速度快,可是公鑰加密技術(shù)提供了更好的身份認證技術(shù)。SSL 的握手協(xié)議非常有效的讓客戶和服
務(wù)器之間完成相互之間的身份認證,其主要過程如下:
①客戶端的瀏覽器向服務(wù)器傳送客戶端 SSL 協(xié)議的版本號,加密算法的種類,產(chǎn)生的隨機數(shù),以及其他服務(wù)器和客戶端之間通訊所需要的各種信息。
②服務(wù)器向客戶端傳送 SSL 協(xié)議的版本號,加密算法的種類,隨機數(shù)以及其他相關(guān)信息,同時服務(wù)器還將向客戶端傳送自己的證書。
③客戶利用服務(wù)器傳過來的信息驗證服務(wù)器的合法性,服務(wù)器的合法性包括:證書是否過期,發(fā)行服務(wù)器證書的 CA 是否可靠,發(fā)行者證書的公鑰能否正確解開服務(wù)器證書的“發(fā)行者的數(shù)字
簽名”,服務(wù)器證書上的域名是否和服務(wù)器的實際域名相匹配。如果合法性驗證沒有通過,通訊將斷開;如果合法性驗證通過,將繼續(xù)進行第四步。
④用戶端隨機產(chǎn)生一個用于后面通訊的“對稱密碼”,然后用服務(wù)器的公鑰(服務(wù)器的公鑰從步驟②中的服務(wù)器的證書中獲得)對其加密,然后將加密后的“預(yù)主密碼”傳給服務(wù)器。
⑤如果服務(wù)器要求客戶的身份認證(在握手過程中為可選),用戶可以建立一個隨機數(shù)然后對其進行數(shù)據(jù)簽名,將這個含有簽名的隨機數(shù)和客戶自己的證書以及加密過的“預(yù)主密碼”一起傳
給服務(wù)器。
⑥如果服務(wù)器要求客戶的身份認證,服務(wù)器必須檢驗客戶證書和簽名隨機數(shù)的合法性,具體的合法性驗證過程包括:客戶的證書使用日期是否有效,為客戶提供證書的CA 是否可靠,發(fā)行CA
的公鑰能否正確解開客戶證書的發(fā)行 CA 的數(shù)字簽名,檢查客戶的證書是否在證書廢止列表(CRL)中。檢驗如果沒有通過,通訊立刻中斷;如果驗證通過,服務(wù)器將用自己的私鑰解開加密的
“預(yù)主密碼”,然后執(zhí)行一系列步驟來產(chǎn)生主通訊密碼(客戶端也將通過同樣的方法產(chǎn)生相同的主通訊密碼)。
⑦服務(wù)器和客戶端用相同的主密碼即“通話密碼”,一個對稱密鑰用于 SSL 協(xié)議的安全數(shù)據(jù)通訊的加解密通訊。同時在 SSL 通訊過程中還要完成數(shù)據(jù)通訊的完整性,防止數(shù)據(jù)通訊中的任何
變化。
⑧客戶端向服務(wù)器端發(fā)出信息,指明后面的數(shù)據(jù)通訊將使用的步驟⑦中的主密碼為對稱密鑰,同時通知服務(wù)器客戶端的握手過程結(jié)束。
⑨服務(wù)器向客戶端發(fā)出信息,指明后面的數(shù)據(jù)通訊將使用的步驟⑦中的主密碼為對稱密鑰,同時通知客戶端服務(wù)器端的握手過程結(jié)束。
⑩SSL 的握手部分結(jié)束,SSL 安全通道的數(shù)據(jù)通訊開始,客戶和服務(wù)器開始使用相同的對稱密鑰進行數(shù)據(jù)通訊,同時進行通訊完整性的檢驗。
下面是在tomcat下實現(xiàn)https,使用jdk自帶的keytool工具生成自簽名證書。
1 生成keystore文件,keystore文件用來存儲密鑰和證書
keystore的詳細參數(shù)可使用 可使用keystore命令查看。
keytool -genkeypair -keyalg rsa -keysize 2048 -sigalg sha1withrsa -validity 3600 -alias www.joe.com -keystore e:\ssl\joe.keystore
輸入keystore密碼:
再次輸入新密碼:
您的名字與姓氏是什么?
[Unknown]: www.joe.com
您的組織單位名稱是什么?
[Unknown]: joe
您的組織名稱是什么?
[Unknown]: joe
您所在的城市或區(qū)域名稱是什么?
[Unknown]: bj
您所在的州或省份名稱是什么?
[Unknown]: bj
該單位的兩字母國家代碼是什么
[Unknown]: cn
CN=www.joe.com, OU=joe, O=joe, L=bj, ST=bj, C=cn 正確嗎?
[否]: y
輸入<www.joe.com>的主密碼
(如果和 keystore 密碼相同,按回車):
2 導(dǎo)出自簽名證書。正是平臺需要導(dǎo)出csr文件并去權(quán)威的ca認證機構(gòu)獲取受信任證書,一般是收費的。
keytool -exportcert -alias www.joe.com -keystore e:\ssl\joe.keystore -file e:\ssl\joe.cer -rfc
輸入keystore密碼:
保存在文件中的認證 <e:\ssl\joe.cer>
下面配置tomcat(server.xml)使其支持https.
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystoreFile="conf/joe.keystore" keystorePass="123456"/>
3 修改操作系統(tǒng)host文件,添加127.0.0.1 www.joe.com
4 新建web應(yīng)用httpstest
并添加indexjsp:
<body>
<%
for(Enumeration en = request.getAttributeNames();en.hasMoreElements();){
String name = (String)en.nextElement();
out.println(name);
out.println("="+request.getAttribute(name));
out.println();
}
%>
</body>
5 為了讓瀏覽器信任我們的證書,需要在瀏覽器導(dǎo)入我們的證書為信任根證書。
6 訪問:https://www.joe.com/httpstest
輸出:
javax.servlet.request.ssl_session =4e05eb849ac41a45b56725488b68c28cc8c2ea94e2ec599852e1665297b2822b
javax.servlet.request.key_size =128
javax.servlet.request.cipher_suite =SSL_RSA_WITH_RC4_128_MD5 (通訊的加密信息,由瀏覽器和服務(wù)器協(xié)商確定)。