Posted on 2011-06-25 23:06
瘋狂 閱讀(1439)
評論(0) 編輯 收藏 所屬分類:
java 、
java安全
HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密
的詳細內容就需要SSL
SSL協議的握手過程
SSL 協議既用到了公鑰加密技術又用到了對稱加密技術,對稱加密技術雖然比公鑰加密技術的速度快,可是公鑰加密技術提供了更好的身份認證技術。SSL 的握手協議非常有效的讓客戶和服
務器之間完成相互之間的身份認證,其主要過程如下:
①客戶端的瀏覽器向服務器傳送客戶端 SSL 協議的版本號,加密算法的種類,產生的隨機數,以及其他服務器和客戶端之間通訊所需要的各種信息。
②服務器向客戶端傳送 SSL 協議的版本號,加密算法的種類,隨機數以及其他相關信息,同時服務器還將向客戶端傳送自己的證書。
③客戶利用服務器傳過來的信息驗證服務器的合法性,服務器的合法性包括:證書是否過期,發行服務器證書的 CA 是否可靠,發行者證書的公鑰能否正確解開服務器證書的“發行者的數字
簽名”,服務器證書上的域名是否和服務器的實際域名相匹配。如果合法性驗證沒有通過,通訊將斷開;如果合法性驗證通過,將繼續進行第四步。
④用戶端隨機產生一個用于后面通訊的“對稱密碼”,然后用服務器的公鑰(服務器的公鑰從步驟②中的服務器的證書中獲得)對其加密,然后將加密后的“預主密碼”傳給服務器。
⑤如果服務器要求客戶的身份認證(在握手過程中為可選),用戶可以建立一個隨機數然后對其進行數據簽名,將這個含有簽名的隨機數和客戶自己的證書以及加密過的“預主密碼”一起傳
給服務器。
⑥如果服務器要求客戶的身份認證,服務器必須檢驗客戶證書和簽名隨機數的合法性,具體的合法性驗證過程包括:客戶的證書使用日期是否有效,為客戶提供證書的CA 是否可靠,發行CA
的公鑰能否正確解開客戶證書的發行 CA 的數字簽名,檢查客戶的證書是否在證書廢止列表(CRL)中。檢驗如果沒有通過,通訊立刻中斷;如果驗證通過,服務器將用自己的私鑰解開加密的
“預主密碼”,然后執行一系列步驟來產生主通訊密碼(客戶端也將通過同樣的方法產生相同的主通訊密碼)。
⑦服務器和客戶端用相同的主密碼即“通話密碼”,一個對稱密鑰用于 SSL 協議的安全數據通訊的加解密通訊。同時在 SSL 通訊過程中還要完成數據通訊的完整性,防止數據通訊中的任何
變化。
⑧客戶端向服務器端發出信息,指明后面的數據通訊將使用的步驟⑦中的主密碼為對稱密鑰,同時通知服務器客戶端的握手過程結束。
⑨服務器向客戶端發出信息,指明后面的數據通訊將使用的步驟⑦中的主密碼為對稱密鑰,同時通知客戶端服務器端的握手過程結束。
⑩SSL 的握手部分結束,SSL 安全通道的數據通訊開始,客戶和服務器開始使用相同的對稱密鑰進行數據通訊,同時進行通訊完整性的檢驗。
下面是在tomcat下實現https,使用jdk自帶的keytool工具生成自簽名證書。
1 生成keystore文件,keystore文件用來存儲密鑰和證書
keystore的詳細參數可使用 可使用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
您所在的城市或區域名稱是什么?
[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 導出自簽名證書。正是平臺需要導出csr文件并去權威的ca認證機構獲取受信任證書,一般是收費的。
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 修改操作系統host文件,添加127.0.0.1 www.joe.com
4 新建web應用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 為了讓瀏覽器信任我們的證書,需要在瀏覽器導入我們的證書為信任根證書。
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 (通訊的加密信息,由瀏覽器和服務器協商確定)。