CA認證原理以及實現(下)

在上述的文章後瞭解到原理以後,咱們這篇文章來進行CA的搭建。javascript

OPEN SSL 環境搭建
在基礎原理中咱們提到了兩種認證服務,單項認證服務和雙向認證服務,咱們就以雙向認證服務舉例說明。
OpenSSL是一個開放源代碼軟件包,實現了SSL以及相關加密技術,是最經常使用的證書管理工具,OpenSSL功能遠勝於KeyTool,可用於根證書(KeyTool不含有,所以KeyTool沒有辦法做爲CA)、服務器證書、客戶證書的管理。
在OpenSSL官網下載:http:www.openssl.org/source/下載最新的源碼,官網還提供了windows版的二進制發行版地址:http://www.slproweb.com/products/Win32OpenSSL.html
 一、 準備工做
 選擇適合本身操做系統的版本進行下載後,安裝操做與普通軟件同樣,沒有什麼區別
 設置環境變量:
html

 

打開配置文件openssl.cfg(%OpenSSL_Home%\bin\openssl.cfg),找到配置[CA_default]:java

上述變量dir,它指向的是CA工做目錄,能夠對其進行修改web

二、 建立bat文件
整個bat文件的建立過程咱們能夠把它想象成這樣一種場景:
高考結束,教育局來頒發畢業證書給各個學校,各個學校在把證書發給學生,具體步驟以下:
1) 教育局先有空白證書了
2) 教育局又有本身的公章
3) 讓各個學校能夠擁有畢業證發放申請
4) 對空白的畢業證蓋上了教育局的公章,並能夠交給已經申請的學校
5) 申請的學校拿到了蓋有教育局的畢業證後,準備對其蓋上本身的公章
6) 學校在教育局已經蓋上教育局公章的畢業證上又蓋上了本身學校的公章
7) 準備把畢業證發給學校申請畢業的學生們
8) 申請畢業的學生拿取本身的學生證和身份證準備領取畢業證
9) 來到學校教務處,填寫單據申請學校發放畢業證
10) 教育局已經轉交學校來發放畢業證,此時學校把畢業證發放給申請學生
11) 學生認爲蓋有教育局的公章和學校的公章的畢業證是有效的算法

 

上述步驟,均可以在下面的bat文件中找到相應的地方:windows

Xml代碼    收藏代碼
  1. //構建ca子目錄(證書建立時,用到下述目錄,最終在certs目錄中得到證書文件)  
  2. echo 構建已髮型證書存放目錄 certs  
  3. mkdir certs  
  4. echo 構建新證書存放目錄 newcerts  
  5. mkdir newcerts  
  6. echo 構建私鑰存放目錄 private  
  7. mkdir private  
  8. echo 構建證書吊銷列表存放目錄 crl  
  9. mkdir cr1   
  10. //構建相關文件,完成後能夠進行證書的構建和簽發工做  
  11. echo 構建索引文件 index.txt  
  12. echo 0>index.txt  
  13. echo 構建序列號文件 serial  
  14. echo 01>serial  
  15.       //構建根證書   
  16. echo 構建隨機數 private/.rand  
  17. openssl rand -out private/.rand 1000  
  18. //構建根證書私鑰  
  19. echo 構建根證書私鑰 private/ca.key.pem  
  20. openssl genrsa -aes256 -out private/ca.key.pem 2048  
  21. //完成密鑰構建操做後,須要生成根證書籤發申請文件ca.csr  
  22. //生成根證書籤發申請  
  23. echo 生成根證書籤發申請 private/ca.csr  
  24. openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C=CN/ST=HUBEI/L=WUHAN/O=YALE/OU=YALE/CN=*.qiujinyong.org"  
  25. //執行完後此處又要輸入根證書密碼  
  26. //獲得根證書籤發申請文件後,能夠將其發送給CA機構簽發,也能夠自行簽發根證書  
  27. echo 簽發根證書 private/ca.cer    
  28. openssl x509 -req -days 1000 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer  
  29. //執行完後此處又要輸入根證書密碼  
  30. echo 根證書轉換 private/ca.p12  
  31. openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certs/ca.cer -out certs/ca.p12  
  32. //執行完後此處又要輸入根證書密碼  
  33. //構建服務器證書  
  34. echo 構建服務器私鑰 private/server.key.pem  
  35. openssl genrsa -aes256 -out private/server.key.pem 2048  
  36. //服務器證書籤發申請  
  37. echo 生成服務器證書籤發申請 private/server.csr  
  38. openssl req -new -key private/server.key.pem -out private/server.csr -subj "/C=CN/ST=HUBEI/L=WUHAN/O=YALE/OU=YALE/CN=www.qiujinyong.com"  
  39. //執行完後此處又要輸入根證書密碼  
  40. //根證書籤發服務器證書   
  41. echo 簽發服務器證書 private/server.cer  
  42. openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.cer  
  43. //執行完後此處又要輸入根證書密碼  
  44. //將OpenSSL產生的數字證書轉換爲PKCS#12編碼格式  
  45. echo 服務器證書轉換 private/server.p12  
  46. openssl pkcs12 -export -clcerts -inkey private/server.key.pem -in certs/server.cer -out certs/server.p12  
  47. //執行完後此處又要輸入根證書密碼  
  48. //構建客戶證書  
  49. echo 產生客戶私鑰 private/client.key.pem  
  50. openssl genrsa -aes256 -out private/client.key.pem 2048  
  51. //執行完後此處又要輸入根證書密碼  
  52. //產生客戶證書籤發申請  
  53. echo 生成客戶證書籤發申請 client.csr  
  54. openssl req -new -key private/client.key.pem -out private/client.csr -subj "/C=CN/ST=HUBEI/L=WUHAN/O=YALE/OU=YALE/CN=qiujinyong"  
  55. //執行完後此處又要輸入根證書密碼  
  56. //根證書籤發客戶證書  
  57. echo 簽發客戶證書 certs/client.cer  
  58. openssl  x509 -req -days 3650 -sha1 -extensions v3_req -CA  certs/ca.cer  -CAkey  private/ca.key.pem  -CAserial ca.srl -CAcreateserial -in private/client.csr -out  certs/client.cer  
  59. //執行完後此處又要輸入根證書密碼  
  60. //將得到客戶證書轉換JAVA語言能夠識別的PKCS#12編碼格式  
  61. echo 客戶證書轉換 certs/client.p12  
  62. openssl pkcs12 -export -inkey private/client.key.pem -in certs/client.cer -out certs/client.p12  
  63. //完成了雙向認證的所需的所有證書  

 

三、 文件生成
經過上述語句咱們生成了如下幾個「一級」文件以及文件夾:瀏覽器

 

Certs文件夾下又生成了:tomcat

 

Private文件夾下又生成了:服務器

 

四、 證書導入
咱們使用ca.p十二、server.p十二、client.p12我的信息交換文件構建雙向認證,在驗證操做以前,咱們先導入ca.p十二、client.p12文件session

ca.p12文件是ca根證書的我的信息交換文件:
雙擊」ca.p12」或者點擊在瀏覽器"工具"->"internet選項"->"內容"中的"證書"->"導入"



點擊「下一步」後,「瀏覽」按鈕時,指定我的信息交換文件格式(*.p12;*.pfx), 選擇「ca.p12的所在位置」:

 

 

輸入私鑰的密碼:

 

選擇「將全部的證書放入下列存儲」:

 

點擊「瀏覽」,選擇「受信任的根證書頒發機構」:

 

 

 

點擊「下一步」,而後點擊「完成」

導入」client.p12」文件:
導入clinet.p12文件的方式和ca.p12文件方式基本類似,只是在證書存儲時,選擇「我的」:

 

 

五、 服務器配置
將」ca.p12」、」server.p12」文件複製到tomcat的conf目錄下:

同時,須要在windows系統下經過ie導入ca.p12和client.p12文件:

 

 

咱們在tomcat的server.xml文件中配置雙向認證:

Xml代碼    收藏代碼
  1. <Connector port="443" maxHttpHeaderSize="8192"  
  2.           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  
  3.    sslProtocol="TLS" keystoreFile="conf/server.p12"    
  4.    keystorePass="123456" keystoreType="PKCS12"                               
  5.           truststoreFile="conf/ca.p12" acceptCount="100" scheme="https" secure="true"  
  6.           sslEnabled="true" clientAuth="true" truststorePass="123456" truststoreType="PKCS12"/>  

 這裏的密鑰庫文件參數keystoreFile指向server.p12文件,密鑰庫密碼參數keystorePass值爲」123456」,密鑰庫類型參數keystoreType值爲」PKCS12」,由於雙向認證服務區分信任庫文件和密鑰庫文件,此時,server.p12文件將做爲密鑰庫文件,而ca.p12文件則做爲信任庫文件,所以,信任庫文件參數truststoreFile指向ca.p12文件,信任庫密碼參數truststorePass值爲」123456」,信任庫類型參數truststoreType值爲「pkcs12」,clientAuth的值爲」true」,這是打開雙向認證的關鍵一步,port默認爲8443,如今修改成443,這樣就省去咱們在地址欄中輸入端口號。


 

效果展示

 輸入咱們證書綁定的網站,https打頭:

 

 

 查看給該網站頒發的證書的屬性:

 

點擊授予權限:

 

若是咱們是本身建立的根證書沒有經過CA驗證的話,那麼會在地址欄中看到相關信息,以下圖:

 


點擊繼續瀏覽, 雖然咱們鏈接的是本地服務器,但仍然會感到有些延時,這是由於瀏覽器訪問CA機構驗證該證書,並初始化加密/解密等信息:

 

 上述咱們看到「證書錯誤」,就是由於咱們的根證書並無獲得CA的認證

 

咱們若是加上驗證的代碼後:

Java代碼    收藏代碼
  1. for(Enumeration en = request.getAttributeNames();  
  2.      en.hasMoreElements();){  
  3.      String name = (String)en.nextElement();  
  4.      out.println(name);  
  5.      out.println(" = " + request.getAttribute(name));  
  6.      out.println();  
  7. }  

 

能夠看到以下結果:

上述有些相關屬性解釋:javax.servlet.request.ssl_session:當前SSL/TLS協議的會話IDjava.servlet.request.key_size:當前加密算法所使用的密鑰長度javax.servlet.request.cipher_suite:當前SSL /TLS協議所使用的加密套件(好比上述:使用的TLS協議,RSA的非對稱加密算法,AES的對稱加密算法,同時是128的,SHA的消息摘要算法,CBC的工做模式,,,通常使用非對稱加密算法對數據進行加密/解密操做的效率至關低,而使用對稱加密算法進行加密/解密的效率至關高,合理的解決辦法是使用非對稱加密算法傳遞對稱加密算法的密鑰,使用對稱加密算法對數據加密)javax.servlet.request.X509Certificate:指向客戶證書列表

相關文章
相關標籤/搜索