在網際網路安全通信方式上,目前用的最多的就是https配合ssl和數字證書來保證傳輸和認證安全了。本文追本溯源圍繞這個模式談一談。
名詞解釋
首先解釋一下上面的幾個名詞:
• https:在http(超文本傳輸協定)基礎上提出的一種安全的http協定,是以可以稱為安全的超文本傳輸協定。http協定直接放置在TCP協定之上,而https提出在http和TCP中間加上一層加密層。從發送端看,這一層負責把http的内容加密後送到下層的TCP,從接收方看,這一層負責将TCP送來的資料解密還原成http的内容。
• SSL(Secure Socket Layer):是Netscape公司設計的主要用于WEB的安全傳輸協定。從名字就可以看出它在https協定棧中負責實作上面提到的加密層。
是以,一個https協定棧大緻是這樣的:

• 數字證書:一種檔案的名稱,好比一個機構或人的簽名,能夠證明這個機構或人的真實性。其中包含的資訊,用于實作上述功能。
• 加密和認證:加密是指通信雙方為了防止銘感資訊在信道上被第三方竊聽而洩漏,将明文通過加密變成密文,如果第三方無法解密的話,就算他獲得密文也無能為力;認證是指通信雙方為了确認對方是值得信任的消息發送或接受方,而不是使用假身份的騙子,采取的确認身份的方式。隻有同時進行了加密和認真才能保證通信的安全,是以在SSL通信協定中這兩者都被應。
是以,這三者的關系已經十厘清楚了:https依賴一種實作方式,目前通用的是SSL,數字證書是支援這種安全通信的檔案。另外有SSL衍生出TLS和WTLS,前者是IEFT将SSL标準化之後産生的(TSL1.0),與SSL差别很小,後者是用于無線環境下的TSL。
如何加密
常用的加密算法
• 對稱密碼算法:是指加密和解密使用相同的密鑰,典型的有DES、RC5、IDEA(分組加密),RC4(序列加密);
• 非對稱密碼算法:又稱為公鑰加密算法,是指加密和解密使用不同的密鑰(公開的公鑰用于加密,私有的私鑰用于解密)。比如A發送,B接收,A想確定消息隻有B看到,需要B生成一對公私鑰,并拿到B的公鑰。于是A用這個公鑰加密消息,B收到密文後用自己的與之比對的私鑰解密即可。反過來也可以用私鑰加密公鑰解密。也就是說對于給定的公鑰有且隻有與之比對的私鑰可以解密,對于給定的私鑰,有且隻有與之比對的公鑰可以解密。典型的算法有RSA,DSA,DH;
• 雜湊演算法:散列變換是指把檔案内容通過某種公開的算法,變成固定長度的值(散列值),這個過程可以使用密鑰也可以不使用。這種散列變換是不可逆的,也就是說不能從散列值變成原文。是以,散列變換通常用于驗證原文是否被篡改。典型的算法有:MD5,SHA,Base64,CRC等;
在雜湊演算法(也稱摘要算法)中,有兩個概念,強無碰撞和弱無碰撞。弱無碰撞是對給定的消息x,就是對你想僞造的明文,進行運算得出相同的摘要資訊。也就是說你可以控制明文的内容。強無碰撞是指能找到相同的摘要資訊,但僞造的明文是什麼并不知道。
SSL的加密過程
需要注意的是非對稱加解密算法的效率要比對稱加解密要低的多。是以SSL在握手過程中使用非對稱密碼算法來協商密鑰,實際使用對稱加解密的方法對http内容加密傳輸。
下面是對這一過程的形象的比喻,摘自http://blog.chinaunix.net/u2/82806/showart_1341720.html。
假設A與B通信,A是SSL用戶端,B是SSL伺服器端,加密後的消息放在方括号[]裡,以突出明文消息的差別。雙方的處理動作的說明用圓括号()括起。
A:我想和你安全的通話,我這裡的對稱加密算法有DES,RC5,密鑰交換算法有RSA和DH,摘要算法有MD5和SHA。
B:我們用DES-RSA-SHA這對組合好了。
這是我的證書,裡面有我的名字和公鑰,你拿去驗證一下我的身份(把證書發給A)。
A:(檢視證書上B的名字是否無誤,并通過手頭早已有的數字的證書驗證了B的證書的真實性,如果其中一項有誤,發出警告并斷開連接配接,這一步保證了B的公鑰的真實性)
(産生一份秘密消息,這份秘密消息處理後将用作對稱加密密鑰,加密初始化向量和hmac的密鑰。将這份秘密消息-協定中稱為per_master_secret-用B的公鑰加密,封裝成稱作ClientKeyExchange的消息。由于用了B的公鑰,保證了第三方無法竊聽)
我生成了一份秘密消息,并用你的公鑰加密了,給你(把ClientKeyExchange發給B)
注意,下面我就要用加密的辦法給你發消息了!
(将秘密消息進行處理,生成加密密鑰,加密初始化向量和hmac的密鑰)
[我說完了]
B:(用自己的私鑰将ClientKeyExchange中的秘密消息解密出來,然後将秘密消息進行處理,生成加密密鑰,加密初始化向量和hmac的密鑰,這時雙方已經安全的協商出一套加密辦法了)
注意,我也要開始用加密的辦法給你發消息了!
A: [我的秘密是...]
B: [其它人不會聽到的...]
從上面的過程可以看到,SSL協定是如何用非對稱密碼算法來協商密鑰,并使用密鑰加密明文并傳輸的。還有以下幾點補充:
1.B使用數字證書把自己的公鑰和其他資訊包裝起來發送A,A驗證B的身份,下面會談到A是如何驗證的。
2.A生成了了加密密鑰、加密初始化向量和hmac密鑰是雙方用來将明文摘要和加密的。加密初始化向量和hmac密鑰首先被用來對明文摘要(防止明文被篡改),然後這個摘要和明文放在一起用加密密鑰加密後傳輸。
3.由于隻有B有私鑰,是以隻有B可以解密ClientKeyExchange消息,并獲得之後的通信密鑰。
4.事實上,上述過程B沒有驗證A的身份,如果需要的話,SSL也是支援的,此時A也需要提供自己的證書,這裡就不展開了。在設定IIS的SSL Require的時候,通常預設都是igore client certification的
數字證書
由上面的讨論可以知道,數字證書在ssl傳輸過程中扮演身份認證和密鑰分發的功能。究竟什麼是數字證書呢?
簡而言之數字證書是一種網絡上證明持有者身份的檔案,同時還包含有公鑰。一方面,既然是檔案那麼就有可能“僞造”,是以,證書的真僞就需要一個驗證方式;另一方面,驗證方需要認同這種驗證方式。
對于第一個需求,目前的解決方案是,證書可以由國際上公認的證書機構頒發,這些機構是公認的信任機構,一些驗證證書的用戶端應用程式:比如浏覽器,郵件用戶端等,對于這些機構頒發的證書完全信任。當然想要請這些機構頒發證書可是要付“到了斯”的,通常在windows部署系統的時候會讓用戶端安裝我們自己伺服器的根證書,這樣用戶端同樣可以信任我們的證書。
對于第二個需求,用戶端程式通常通過維護一個“根受信任機構清單”,當收到一個證書時,檢視這個證書是否是該清單中的機構頒發的,如果是則這個證書是可信任的,否則就不信任。
證書的信任
是以作為一個https的站點需要與一個證書綁定,無論如何,證書總是需要一個機構頒發的,這個機構可以是國際公認的證書機構,也可以是任何一台安裝有證書服務的計算機。用戶端是否能夠信任這個站點的證書,首先取決于用戶端程式是否導入了證書頒發者的根證書。
下圖說明了這個流程:
有時一個證書機構可能授權另一個證書機構頒發證書,這樣就出現了證書鍊。IE浏覽器在驗證證書的時候主要從下面三個方面考察,隻要有任何一個不滿足都将給出警告
• 證書的頒發者是否在“根受信任的證書頒發機構清單”中
• 證書是否過期
• 證書的持有者是否和通路的網站一緻
另外,浏覽器還會定期檢視證書頒發者公布的“證書吊銷清單”,如果某個證書雖然符合上述條件,但是被它的頒發者在“證書吊銷清單”中列出,那麼也将給出警告。每個證書的CRL Distribution Point字段顯示了檢視這個清單的url。
SSL證書申請的3個主要步驟
1、制作CSR檔案。
所謂CSR就是由申請人制作的Certificate Secure Request證書請求檔案。制作過程中,系統會産生2個密鑰,一個是公鑰就是這個CSR檔案,另外一個是私鑰,存放在伺服器上。要制作CSR檔案,申請人可以參考WEB SERVER的文檔,一般APACHE等,使用OPENSSL指令行來生成KEY+CSR2個檔案,Tomcat,JBoss,Resin等使用 KEYTOOL來生成JKS和CSR檔案,IIS通過向導建立一個挂起的請求和一個CSR檔案。
2、CA認證。
将CSR送出給CA,CA一般有2種認證方式:
1)域名認證:一般通過對管理者郵箱認證的方式,這種方式認證速度快,但是簽發的證書中沒有企業的名稱;
2)企業文檔認證:需要提供企業的營業執照。一般需要3-5個工作日。
也有需要同時認證以上2種方式的證書,叫EV證書,這種證書可以使IE7以上的浏覽器位址欄變成綠色,是以認證也最嚴格。
3、證書的安裝。
在收到CA的證書後,可以将證書部署上伺服器,一般APACHE檔案直接将KEY+CER複制到檔案上,然後修改HTTPD.CONF檔案;TOMCAT等,需要将CA簽發的證書CER檔案導入JKS檔案後,複制上伺服器,然後修改SERVER.XML;IIS需要處理挂起的請求,将 CER檔案導入。
獨立Tomcat+SSL
Tomcat 是很常見的 Java應用伺服器,當然也可以作為獨立的 Web伺服器,所有使用者請求直接通路 tomcat。
如果 Tomcat 作為獨立的Web伺服器,那麼就需要配置Tomcat就可以了,文檔參考這裡 和 這個。主要是配置存放證書的 Keystore 和 連接配接器Connector。
Java的keystore
keystore 是 Java 中專用并内置的一個類似于 openssl 的工具,一個 keystore 檔案就是一個“保險箱”(database),專門存放證書和密鑰,和相關的管理功能:生成自簽發的證書、密鑰、導入導出等。可以通過 keytool 指令或 Java api 互動。
利用keytool 指令将你的證書導入進去。
Tomcat中Connector
tomcat中有三種 Connector 實作:block、nio 和 APR。前兩者使用Java SSL(這需要 keystore 的配置 ),APR使用OpenSSL(不需要用keystore,直接指定證書),配置略有不同。
SSL證書類型
SSL證書需要向國際公認的證書證書認證機構(簡稱CA,Certificate Authority)申請。
CA機構頒發的證書有3種類型:
域名型SSL證書(DV SSL):信任等級普通,隻需驗證網站的真實性便可頒發證書保護網站;
企業型SSL證書(OV SSL):信任等級強,須要驗證企業的身份,稽核嚴格,安全性更高;
增強型SSL證書(EV SSL):信任等級最高,一般用于銀行證券等金融機構,稽核嚴格,安全性最高,同時可以激活綠色網址欄
在tomcat中導入SSL證書
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"
keystoreFile="/home/ow/tomcat/conf/candy.jks" keystorePass="changeit" />
所有檔案夾以及檔案名請根據實際情況,注意:.cer檔案和.crt檔案是一樣的
注意:以下步驟主要是為了完成.jks(keystore檔案),是以在伺服器操作和在本地操作是一樣的,最終複制到伺服器上即可。
本地操作注意要安裝Java的環境,找到Java路徑下的 keytool工具。(若是OsX系統可以直接運作keytool指令)
生成
keytool -genkey -alias server -keyalg RSA -keysize 2048 -keystore C:\keystore.jks -storepass password -keypass password
注意:除了“該機關的雙字母國家/地區代碼是什麼?”填寫大寫的CN,其他都填域名(圖檔上的www.pianyissl.com 要改成你自己的域名噢)
以下指令中的路徑以您的實際路徑為準!
生成CSR
keytool -certreq -alias server -sigalg SHA1withRSA -file C:\req.csr -keystore C:\keystore.jks -keypass password -storepass password
生成後在本站訂單頁面送出CSR檔案(也就是certreq.csr的内容)。完成證書申請後再進入下面步驟。
導入中級證書(3個檔案,下載下傳自訂單頁面的ca.crt,用記事本打開每一段-----begin----- .....-----end----- 儲存為一個檔案,共有3個檔案,分别儲存為1.crt,2.crt,3.crt)
keytool -import -alias intermediate1 -keystore C:\keystore.jks -trustcacerts -storepass password -file C:\1.crt
操作過程中如果提示“如果提示 認證已存在與CA keystore整個系統中您人想要把他添加到自己的keystore嗎?“輸入Y即可
keytool -import -alias intermediate2 -keystore C:\keystore.jks -trustcacerts -storepass password -file C:\2.crt
keytool -import -alias intermediate3 -keystore C:\keystore.jks -trustcacerts -storepass password -file C:\3.crt
導入伺服器證書(域名.crt檔案)
keytool -import -alias server -keystore C:\keystore.jks -trustcacerts -storepass password -file C:\4.crt
檢視
keytool -list -keystore C:\keystore.jks -storepass password
PS:
證書正确配置後,發現以下兩個問題:
1)、手機通路網站提示,證書不安全
2)、微信掃描APP下載下傳二維碼,打不開頁面;用手機浏覽器(UC等)可以正常掃描下載下傳
經百度,發現是缺少中間正式的原因,可以通過https://www.myssl.cn/tools/check-server-cert.html進行檢測證書是否安裝正确。
解決方案:
1)、在web.xml中添加以下代碼,通路非https時,自動跳轉到https。
<security-constraint>
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
2)、通過https://www.myssl.cn/tools/merge-jks-cert.html進行證書合成,自動導入中間證書,解決微信、手機通路的安全提示等問題。
作者:
Candyメ奶糖出處:
http://www.cnblogs.com/Candies/本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
博文來源廣泛,如原作者認為我侵犯知識産權,請盡快給我發郵件
[email protected]聯系,我将以第一時間删除相關内容。