在上述的文章後瞭解到原理以後,咱們這篇文章來進行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
- //構建ca子目錄(證書建立時,用到下述目錄,最終在certs目錄中得到證書文件)
- echo 構建已髮型證書存放目錄 certs
- mkdir certs
- echo 構建新證書存放目錄 newcerts
- mkdir newcerts
- echo 構建私鑰存放目錄 private
- mkdir private
- echo 構建證書吊銷列表存放目錄 crl
- mkdir cr1
- //構建相關文件,完成後能夠進行證書的構建和簽發工做
- echo 構建索引文件 index.txt
- echo 0>index.txt
- echo 構建序列號文件 serial
- echo 01>serial
- //構建根證書
- echo 構建隨機數 private/.rand
- openssl rand -out private/.rand 1000
- //構建根證書私鑰
- echo 構建根證書私鑰 private/ca.key.pem
- openssl genrsa -aes256 -out private/ca.key.pem 2048
- //完成密鑰構建操做後,須要生成根證書籤發申請文件ca.csr
- //生成根證書籤發申請
- echo 生成根證書籤發申請 private/ca.csr
- 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"
- //執行完後此處又要輸入根證書密碼
- //獲得根證書籤發申請文件後,能夠將其發送給CA機構簽發,也能夠自行簽發根證書
- echo 簽發根證書 private/ca.cer
- openssl x509 -req -days 1000 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer
- //執行完後此處又要輸入根證書密碼
- echo 根證書轉換 private/ca.p12
- openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certs/ca.cer -out certs/ca.p12
- //執行完後此處又要輸入根證書密碼
- //構建服務器證書
- echo 構建服務器私鑰 private/server.key.pem
- openssl genrsa -aes256 -out private/server.key.pem 2048
- //服務器證書籤發申請
- echo 生成服務器證書籤發申請 private/server.csr
- 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"
- //執行完後此處又要輸入根證書密碼
- //根證書籤發服務器證書
- echo 簽發服務器證書 private/server.cer
- 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
- //執行完後此處又要輸入根證書密碼
- //將OpenSSL產生的數字證書轉換爲PKCS#12編碼格式
- echo 服務器證書轉換 private/server.p12
- openssl pkcs12 -export -clcerts -inkey private/server.key.pem -in certs/server.cer -out certs/server.p12
- //執行完後此處又要輸入根證書密碼
- //構建客戶證書
- echo 產生客戶私鑰 private/client.key.pem
- openssl genrsa -aes256 -out private/client.key.pem 2048
- //執行完後此處又要輸入根證書密碼
- //產生客戶證書籤發申請
- echo 生成客戶證書籤發申請 client.csr
- 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"
- //執行完後此處又要輸入根證書密碼
- //根證書籤發客戶證書
- echo 簽發客戶證書 certs/client.cer
- 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
- //執行完後此處又要輸入根證書密碼
- //將得到客戶證書轉換JAVA語言能夠識別的PKCS#12編碼格式
- echo 客戶證書轉換 certs/client.p12
- openssl pkcs12 -export -inkey private/client.key.pem -in certs/client.cer -out certs/client.p12
- //完成了雙向認證的所需的所有證書
三、 文件生成
經過上述語句咱們生成了如下幾個「一級」文件以及文件夾:瀏覽器
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文件中配置雙向認證:
- <Connector port="443" maxHttpHeaderSize="8192"
- maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
- sslProtocol="TLS" keystoreFile="conf/server.p12"
- keystorePass="123456" keystoreType="PKCS12"
- truststoreFile="conf/ca.p12" acceptCount="100" scheme="https" secure="true"
- 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的認證
咱們若是加上驗證的代碼後:
- for(Enumeration en = request.getAttributeNames();
- en.hasMoreElements();){
- String name = (String)en.nextElement();
- out.println(name);
- out.println(" = " + request.getAttribute(name));
- out.println();
- }
能夠看到以下結果:
上述有些相關屬性解釋: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:指向客戶證書列表