HTTPS單向認(rèn)證和雙向認(rèn)證
一、背景&概念
HTTPS:在http(超文本傳輸協(xié)議)基礎(chǔ)上提出的一種安全的http協(xié)議,因此可以稱為安全的超文本傳輸協(xié)議。 http協(xié)議直接放置在TCP協(xié)議之上,而https提出在http和TCP中間加上一層加密層。從發(fā)送端看,這一層負(fù)責(zé)把http的內(nèi)容加密后送到下層 的TCP,從接收方看,這一層負(fù)責(zé)將TCP送來的數(shù)據(jù)解密還原成http的內(nèi)容。
SSL(Secure Socket Layer):是Netscape公司設(shè)計(jì)的主要用于WEB的安全傳輸協(xié)議。從名字就可以看出它在https協(xié)議棧中負(fù)責(zé)實(shí)現(xiàn)上面提到的加密層。因此,一個(gè)https協(xié)議棧大致是這樣的:
數(shù)字證書:一種文件的名稱,好比一個(gè)機(jī)構(gòu)或人的簽名,能夠證明這個(gè)機(jī)構(gòu)或人的真實(shí)性。其中包含的信息,用于實(shí)現(xiàn)上述功能。
加密和認(rèn)證:加密是指通信雙方為了防止銘感信息在信道上被第三方竊聽而泄漏,將明文通過加密變成密文,如果第三方無法解密的話,就算他獲得密文也無能為力;認(rèn)證是指通信雙方為了確認(rèn)對(duì)方是值得信任的消息發(fā)送或接受方,而不是使用假身份的非法者,采取的確認(rèn)身份的方式。只有同時(shí)進(jìn)行了加密和認(rèn)證才能保證通信的安全,因此在SSL通信協(xié)議中這兩者都被應(yīng)。早期一般是用對(duì)稱加密算法,現(xiàn)在一般都是不對(duì)稱加密,最常見的算法就是RSA。
消息摘要:這個(gè)技術(shù)主要是為了避免消息被篡改。消息摘要是把一段信息,通過某種算法,得出一串字符串。這個(gè)字符串就是消息的摘要。如果消息被篡改(發(fā)生了變化),那么摘要也一定會(huì)發(fā)生變化(如果2個(gè)不同的消息生成的摘要是一樣的,那么這就叫發(fā)生了碰撞)。
消息摘要的算法主要有MD5和SHA,在證書領(lǐng)域,一般都是用SHA(安全哈希算法)。
數(shù)字證書、加密和認(rèn)證、消息摘要三個(gè)技術(shù)結(jié)合起來,就是在HTTPS中廣泛應(yīng)用的證書(certificate),證書本身攜帶了加密/解密的信息,并且可以標(biāo)識(shí)自己的身份,也自帶消息摘要。
HTTPS認(rèn)證過程:
①?瀏覽器發(fā)送一個(gè)連接請(qǐng)求給安全服務(wù)器。
②?服務(wù)器將自己的證書,以及同證書相關(guān)的信息發(fā)送給客戶瀏覽器。
③?客戶瀏覽器檢查服務(wù)器送過來的證書是否是由自己信賴的 CA 中心所簽發(fā)的。如果是,就繼續(xù)執(zhí)行協(xié)議;如果不是,客戶瀏覽器就給客戶一個(gè)警告消息:警告客戶這個(gè)證書不是可以信賴的,詢問客戶是否需要繼續(xù)。
④?接著客戶瀏覽器比較證書里的消息,例如域名和公鑰,與服務(wù)器剛剛發(fā)送的相關(guān)消息是否一致,如果是一致的,客戶瀏覽器認(rèn)可這個(gè)服務(wù)器的合法身份。
⑤?服務(wù)器要求客戶發(fā)送客戶自己的證書。收到后,服務(wù)器驗(yàn)證客戶的證書,如果沒有通過驗(yàn)證,拒絕連接;如果通過驗(yàn)證,服務(wù)器獲得用戶的公鑰。
⑥?客戶瀏覽器告訴服務(wù)器自己所能夠支持的通訊對(duì)稱密碼方案。
⑦?服務(wù)器從客戶發(fā)送過來的密碼方案中,選擇一種加密程度最高的密碼方案,用客戶的公鑰加過密后通知瀏覽器。
⑧?瀏覽器針對(duì)這個(gè)密碼方案,選擇一個(gè)通話密鑰,接著用服務(wù)器的公鑰加過密后發(fā)送給服務(wù)器。
⑨?服務(wù)器接收到瀏覽器送過來的消息,用自己的私鑰解密,獲得通話密鑰。
⑩?服務(wù)器、瀏覽器接下來的通訊都是用對(duì)稱密碼方案,對(duì)稱密鑰是加過密的。
上面所述的是雙向認(rèn)證 SSL 協(xié)議的具體通訊過程,這種情況要求服務(wù)器和用戶雙方都有證書。單向認(rèn)證 SSL 協(xié)議不需要客戶擁有 CA 證書,具體的過程相對(duì)于上面的步驟,只需將服務(wù)器端驗(yàn)證客戶證書的過程去掉,以及在協(xié)商對(duì)稱密碼方案,對(duì)稱通話密鑰時(shí),服務(wù)器發(fā)送給客戶的是沒有加過密的 (這并不影響 SSL 過程的安全性)密碼方案。這樣,雙方具體的通訊內(nèi)容,就是加過密的數(shù)據(jù),如果有第三方攻擊,獲得的只是加密的數(shù)據(jù),第三方要獲得有用的信息,就需要對(duì)加密 的數(shù)據(jù)進(jìn)行解密,這時(shí)候的安全就依賴于密碼方案的安全。而幸運(yùn)的是,目前所用的密碼方案,只要通訊密鑰長度足夠的長,就足夠的安全。這也是我們強(qiáng)調(diào)要求使用128 位加密通訊的原因。
二、環(huán)境準(zhǔn)備
Oracle Linux Server release 6.5、JDK1.7.0_45、openssl-1.0.2d
三、單向認(rèn)證 3.1?為服務(wù)器生成證書
keytool -genkey -keyalg RSA -dname "cn=127.0.0.1,ou=inspur,o=none,l=shandong,st=jinan,c=cn" -alias server -keypass 111111 -keystore server.keystore -storepass 111111 -validity 3650
注:cn=127.0.0.1配置的是服務(wù)器IP
3.2?生成csr
生成csr文件用于提交CA認(rèn)證生成證書使用。
keytool -certReq -alias server -keystore server.keystore -file ca.csr
3.3?生成cer
這個(gè)ca.cer是為了解決不信任時(shí)要導(dǎo)入的
keytool -export -alias server -keystore server.keystore -file ca.cer -storepass 111111
3.4 tomcat配置ssl
clientAuth="false"代表單向認(rèn)證,配置如下:
<Connector SSLEnabled="true"?clientAuth="false"
??????? maxThreads="150" port="8443"
??????? protocol="org.apache.coyote.http11.Http11Protocol"或者HTTP/1.1
??????? scheme="https" secure="true" sslProtocol="TLS"
??????? keystoreFile="D:/server.keystore" keystorePass="111111"/>
注: Http11Protocol支持HTTP/1.1協(xié)議,是http1.1協(xié)議的ProtocolHandler實(shí)現(xiàn)。
3.5?解決不信任
啟動(dòng)tomcat,輸入?https://127.0.0.1:8443/
這時(shí)提示框顯示:服務(wù)器的證書不受信任。在瀏覽器內(nèi)顯示以下提示:
此服務(wù)器無法證明它是127.0.0.1;您計(jì)算機(jī)的操作系統(tǒng)不信任其安全證書。出現(xiàn)此問題的原因可能是配置有誤或您的連接被攔截了。
選擇“繼續(xù)前往(不安全)”,也能訪問,但是此時(shí)就是以普通的HTTP方式進(jìn)行信息傳輸了。
選擇安裝步驟3.3生成的ca.cer文件,將證書存儲(chǔ)在“受信任的證書頒發(fā)機(jī)構(gòu)”,就可以通過HTTPS正常訪問了。
3.6?解決程序訪問異常
這時(shí)候如果用程序去訪問可能還會(huì)拋?zhàn)C書不信任的異常sun.security.validator.ValidatorException: PKIX path building failed...
需要將生成的證書(ca.cer )?導(dǎo)入到j(luò)dk中
執(zhí)行以下命令:
keytool -import -alias tomcatsso -file "ca.cer" -keystore "D:javajdk1.6.0_11jrelibsecuritycacerts" -storepass changeit
其中changeit是jre默認(rèn)的密碼。
如果拋?No subject alternative names present,請(qǐng)?jiān)谏蒶eystore?注意CN必須要為域名(或機(jī)器名稱)例如?localhost?不能為IP?。
如果拋?No name matching localhost found,表示你生成keystore CN的名稱和你訪問的名稱不一致。
四、雙向認(rèn)證 4.1?目錄建立
Linux環(huán)境下,在home下建立out32dll目錄,在此目錄下建立ca、client、server三個(gè)文件夾。以下命令均在out32dll目錄下執(zhí)行。
4.2?生成CA證書
創(chuàng)建私鑰?:
openssl genrsa -out ca/ca-key.pem 1024
創(chuàng)建證書請(qǐng)求?:
openssl req -new -out ca/ca-req.csr -key ca/ca-key.pem
-----
Country Name (2 letter code) [AU]:cn?
State or Province Name (full name) [Some-State]:beijing
Locality Name (eg, city) []:fengtai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DKY?
Organizational Unit Name (eg, section) []:0953
Common Name (eg, YOUR name) []:CA
Email Address []:20095335@mail.besti.edu.cn
彈出密碼輸入選項(xiàng),Enter默認(rèn)即可
自簽署證書?:
openssl x509 -req -in ca/ca-req.csr -out ca/ca-cert.pem -signkey ca/ca-key.pem -days 3650
將證書導(dǎo)出成瀏覽器支持的.p12格式?:
openssl pkcs12 -export -clcerts -in ca/ca-cert.pem -inkey ca/ca-key.pem -out ca/ca.p12
密碼:111111
4.3?生成Server證書
一.?? 1.創(chuàng)建私鑰?:?
openssl genrsa -out server/server-key.pem 1024?
2.創(chuàng)建證書請(qǐng)求?:?
openssl req -new -out server/server-req.csr -key server/server-key.pem?
-----?
Country Name (2 letter code) [AU]:cn?
State or Province Name (full name) [Some-State]:beijing?
Locality Name (eg, city) []:fengtai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DKY?
Organizational Unit Name (eg, section) []:0953
Common Name (eg, YOUR name) []:222.28.129.224???注意:一定要寫服務(wù)器所在的ip地址?
Email Address []:20095335@mail.besti.edu.cn
彈出密碼輸入選項(xiàng),Enter默認(rèn)即可
3.自簽署證書?:?
openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650?
4.將證書導(dǎo)出成瀏覽器支持的.p12格式?:?
openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12?
密碼:111111
4.4?生成Clinet證書
創(chuàng)建私鑰?:
openssl genrsa -out client/client-key.pem 1024
創(chuàng)建證書請(qǐng)求?:openssl req -new -out client/client-req.csr -key client/client-key.pem
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:fengtai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DKY
Organizational Unit Name (eg, section) []:0953
Common Name (eg, YOUR name) []:Client
Email Address []:20095335@mail.besti.edu.cn??????
Please enter the following 'extra' attributes to be sent with your certificate request?
A challenge password []:123456?
An optional company name []:tsing?
3.自簽署證書?:
openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650?
4.將證書導(dǎo)出成瀏覽器支持的.p12格式?:?
openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12?
密碼:111111
4.5?根據(jù)CA證書生成jks文件
keytool -keystore truststore.jks -keypass 222222 -storepass 222222 -alias ca -import -trustcacerts -file /home/out32dll/ca/ca-cert.pem
4.6 tomcat配置ssl
tomcat6.0的配置:修改conf/server.xml。?將keystoreFile、truststoreFile的路徑填寫為正確的放置路徑。如下圖:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
??????????????? maxThreads="150" scheme="https" secure="true"
??????????????? clientAuth="true" sslProtocol="TLS"
??????????????? keystoreFile="server.p12" keystorePass="111111" ?keystoreType="PKCS12"
??????????????? truststoreFile="truststore.jks" truststorePass="222222" truststoreType="JKS"/>
4.7?導(dǎo)入證書
將ca.p12,client.p12分別導(dǎo)入到IE中去(打開IE->Internet選項(xiàng)->內(nèi)容->證書)。?ca.p12導(dǎo)入至?受信任的根證書頒發(fā)機(jī)構(gòu),client.p12導(dǎo)入至個(gè)人。
五、瀏覽器驗(yàn)證
驗(yàn)證ssl配置是否正確訪問你的應(yīng)用https://服務(wù)器ip:8443/,如果配置正確的話,
單向認(rèn)證方式會(huì)直接跳轉(zhuǎn)到地址,并且https顯示綠色。
雙向認(rèn)證方式會(huì)出現(xiàn)請(qǐng)求你數(shù)字證書的對(duì)話框,選擇確定,再跳轉(zhuǎn)到地址,并且https顯示綠色。
六、幫助 6.1 Tomcat—server.xml—Connector屬性
屬性
說明
clientAuth
設(shè)置是否雙向驗(yàn)證,默認(rèn)為false,設(shè)置為true代表雙向驗(yàn)證
keystoreFile
服務(wù)器證書文件路徑
keystorePass
服務(wù)器證書密碼
truststoreFile
用來驗(yàn)證客戶端證書的根證書,此例中就是服務(wù)器證書
truststorePass
根證書密碼
?
6.2 keytool
Keytool是一個(gè)Java數(shù)據(jù)證書的管理工具,Keytool將密鑰和證書存在一個(gè)稱為keystore的文件中。常用命令屬性如下:
命令屬性
說明
-genkey
在用戶主目錄中創(chuàng)建一個(gè)默認(rèn)文件".keystore",還會(huì)產(chǎn)生一個(gè)mykey的別名,mykey中包含用戶的公鑰、私鑰和證書
-alias
別名,每個(gè)keystore都關(guān)聯(lián)一個(gè)唯一的alias,通常不區(qū)分大小寫
-keystore
指定密鑰庫的名稱(產(chǎn)生的各類信息將不在.keystore文件中)
-keyalg
指定密鑰的算法(如 RSA? DSA(如果不指定默認(rèn)采用DSA)
-validity
指定創(chuàng)建的證書有效期多少天
-keysize
指定密鑰長度
-storepass
指定密鑰庫的密碼(獲取keystore信息所需的密碼)
-keypass
指定別名條目的密碼(私鑰的密碼)
-dname
指定證書擁有者信息。例如:"CN=名字與姓氏,OU=組織單位名稱,O=組織名稱,L=城市或區(qū)域名稱,ST=省份名稱,C=單位的兩字母國家代碼"
-list
顯示密鑰庫中的證書信息
-v
顯示密鑰庫中的證書詳細(xì)信息
-export
將別名指定的證書導(dǎo)出到文件,例:
keytool ? -export -alias?需要導(dǎo)出的別名 -keystore 指定keystore -file 指定導(dǎo)出的證書位置及證書名稱 -storepass 密碼
-file
參數(shù)指定導(dǎo)出到文件的文件名
-delete
刪除密鑰庫中某條目,例:
keytool -delete -alias?指定需刪除的別名 -keystore 指定keystore? -storepass 密碼
-printcert
查看導(dǎo)出的證書信息,例:keytool ? -printcert -file yushan.crt
-keypasswd
修改密鑰庫中指定條目口令,例:
keytool -keypasswd -alias?需修改的別名 -keypass 舊密碼 -new? 新密碼? -storepass keystore密碼? -keystore
-import
將已簽名數(shù)字證書導(dǎo)入密鑰庫,例:
keytool -import -alias?指定導(dǎo)入條目的別名 -keystore 指定keystore -file 需導(dǎo)入的證書