在上述的文章後了解到原理之後,我們這篇文章來進行CA的搭建。
OPEN SSL 環境搭建
在基礎原理中我們提到了兩種認證服務,單項認證服務和雙向認證服務,我們就以雙向認證服務舉例說明。
OpenSSL是一個開放源代碼軟體包,實作了SSL以及相關加密技術,是最常用的證書管理工具,OpenSSL功能遠勝于KeyTool,可用于根證書(KeyTool不含有,是以KeyTool沒有辦法作為CA)、伺服器證書、客戶證書的管理。
在OpenSSL官網下載下傳:http:www.openssl.org/source/下載下傳最新的源碼,官網還提供了windows版的二進制發行版位址:http://www.slproweb.com/products/Win32OpenSSL.html
1、 準備工作
選擇适合自己作業系統的版本進行下載下傳後,安裝操作與普通軟體一樣,沒有什麼差別
設定環境變量:
打開配置檔案openssl.cfg(%OpenSSL_Home%\bin\openssl.cfg),找到配置[CA_default]:上述變量dir,它指向的是CA工作目錄,可以對其進行修改
2、 建立bat檔案
整個bat檔案的建立過程我們可以把它想象成這樣一種場景:
聯考結束,教育局來頒發畢業證書給各個學校,各個學校在把證書發給學生,具體步驟如下:
1) 教育局先有空白證書了
2) 教育局又有自己的公章
3) 讓各個學校可以擁有畢業證發放申請
4) 對空白的畢業證蓋上了教育局的公章,并可以交給已經申請的學校
5) 申請的學校拿到了蓋有教育局的畢業證後,準備對其蓋上自己的公章
6) 學校在教育局已經蓋上教育局公章的畢業證上又蓋上了自己學校的公章
7) 準備把畢業證發給學校申請畢業的學生們
8) 申請畢業的學生拿取自己的學生證和身份證準備領取畢業證
9) 來到學校教務處,填寫單據申請學校發放畢業證
10) 教育局已經轉交學校來發放畢業證,此時學校把畢業證發放給申請學生
11) 學生認為蓋有教育局的公章和學校的公章的畢業證是有效的
上述步驟,都可以在下面的bat檔案中找到相應的地方:
Xml代碼
- //建構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
- //完成了雙向認證的所需的全部證書
3、 檔案生成
通過上述語句我們生成了以下幾個“一級”檔案以及檔案夾:
Certs檔案夾下又生成了:
Private檔案夾下又生成了:
4、 證書導入
我們使用ca.p12、server.p12、client.p12個人資訊交換檔案建構雙向認證,在驗證操作之前,我們先導入ca.p12、client.p12檔案
ca.p12檔案是ca根證書的個人資訊交換檔案:
輕按兩下”ca.p12”或者點選在浏覽器"工具"->"internet選項"->"内容"中的"證書"->"導入"
點選“下一步”後,“浏覽”按鈕時,指定個人資訊交換檔案格式(*.p12;*.pfx), 選擇“ca.p12的所在位置”:
輸入私鑰的密碼:
選擇“将所有的證書放入下列存儲”:
點選“浏覽”,選擇“受信任的根證書頒發機構”:
點選“下一步”,然後點選“完成”
導入”client.p12”檔案:
導入clinet.p12檔案的方式和ca.p12檔案方式基本相似,隻是在證書存儲時,選擇“個人”:
5、 伺服器配置
将”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的認證
我們如果加上驗證的代碼後:
Java代碼
- 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協定的會話ID
java.servlet.request.key_size:目前加密算法所使用的密鑰長度
javax.servlet.request.cipher_suite:目前SSL /TLS協定所使用的加密套件(比如上述:使用的TLS協定,RSA的非對稱加密算法,AES的對稱加密算法,同時是128的,SHA的消息摘要算法,CBC的工作模式,,,一般使用非對稱加密算法對資料進行加密/解密操作的效率相當低,而使用對稱加密算法進行加密/解密的效率相當高,合理的解決辦法是使用非對稱加密算法傳遞對稱加密算法的密鑰,使用對稱加密算法對資料加密)
javax.servlet.request.X509Certificate:指向客戶證書清單
萬水千山總是情, 領個紅包行不行?
覺得還可以的話記的打賞哦^.^..