0.環境
本文的相關源碼位於 https://github.com/dreamingodd/CA-generation-demo

必須安裝nginx,必須安裝openssl,(用apt-get update, apt-get install來安裝比較簡單)
1.配置和腳本
先創建一個demo目錄(位置自己選擇,我選擇建在nginx的目錄下):
mkdir /etc/nginx/ca-demo cd /etc/nginx/ca-demo
修改SSL配置openssl.cnf(也可能是openssl.conf,不知道在哪可以用find -name / openssl.cnf查找)
將dir屬性改成你上一步自建的目錄,不要用相對路徑,會踩坑,保存,如圖:

我喜歡自動化,所以寫了三個如下腳本,可以直接使用:
ca.sh:
#!/bin/bash #Create directory hierarchy.創建目錄結構 touch index.txt serial chmod 666 index.txt serial echo 01 > serial mkdir -p newcerts private
#生成RSA密鑰對 openssl genrsa -des3 -out ./private/cakey.pem 2048 #openssl req -new -days 365 -key ./private/cakey.pem -out ca.csr #openssl ca -selfsign -in ca.csr -out ca.crt # one step.一步生成csr,crt,直接10年使用期 openssl req -new -x509 -days 3650 -key ./private/cakey.pem -out ca.crt
server.sh:
#!/bin/bash # 簽發服務器證書 mkdir server openssl genrsa -out ./server/server.key openssl req -new -key ./server/server.key -out ./server/server.csr openssl ca -in ./server/server.csr -cert ./ca.crt -keyfile ./private/cakey.pem -out ./server/server.crt -days 3650
client.sh:
#!/bin/bash # 簽發client證書 mkdir client openssl genrsa -des3 -out ./client/client.key 2048 openssl req -new -key ./client/client.key -out ./client/client.csr openssl ca -in ./client/client.csr -cert ./ca.crt -keyfile ./private/cakey.pem -out ./client/client.crt -config "/etc/ssl/openssl.cnf" openssl pkcs12 -export -clcerts -in ./client/client.crt -inkey ./client/client.key -out ./client/client.p12
以上三個腳本都可以在 https://github.com/dreamingodd/CA-generation-demo 找到
將以上三個腳本復制到自建demo目錄中,如下所示:

加入運行權限:
chmod +x *.sh
結果如下:

2.自建CA證書
運行腳本ca.sh,效果如下:

a.輸入密碼短語:(隨便,記住就行,我填的是"demo",需要填3次)
b.生成證書需要填入一些信息:Country Name(國家),State or Province Name(省),Locality Name(市),Organizational Name(組織名,隨便填,我填的是Choosefine Ltd),Common Name(一般填域名),其他可以不填。
這樣證書就生成並自簽名了:

其中,newcerts目錄用於存放CA簽署(頒發)過的數字證書(證書備份目錄)。private目錄用於存放CA的私鑰。 文件serial和index.txt分別用於存放下一個證書的序列號和證書信息數據庫。 文件serial填寫第一個證書序列號(如10000001),之后每前一張證書,序列號自動加1。
可以把ca.crt下載到你的windows系統的PC機上,后面會用到。
3.簽發服務端證書
運行腳本server.sh,效果如下:

最后一句是Data Base Updated,就表示成功了,要填的東西跟上一步非常相似,需要注意的是:
a.國家和省份必須和上一步一樣。
b.Organizational Name必須和上一步一樣。
c.Common Name,如果你的測試服務器有域名的話,填入域名,沒有的話隨便填一個網址,windows訪問測試時配置一下hosts就好,我這里填的是ssl.demo.com。
d.challenge password隨便填,記住就行,我填的demo。
e.pass phrase密碼短語是CA證書的的,我生成的時候用的也是demo。
生成結果:

4.Nginx配置Https單向認證
這一步我要使用上面我們生成的證書s來配置一個安全的Https單向訪問資源鏈接。
首先修改nginx配置文件,
vi /etc/nginx/nginx.conf
在http中加入以下內容:
server { server_name ssl.demo.com; listen 443; ssl on; ssl_certificate ca-demo/server/server.crt; ssl_certificate_key ca-demo/server/server.key; location / { root html; index index.html index.htm; } }
運行以下命令檢查和重啟nginx:
/usr/sbin/nginx -t
service nginx restart
使用IP訪問一下:

成功了,會顯示證書不安全。一般來說,如果花錢使用證書公司簽發的server.crt和server.key不會有這個問題。
這里想解決這個問題的話需要windows本地信任我們自己的CA證書。如果對這個問題不感興趣可以直接跳過。
首先,將我們第二步生成的CA證書下載到windows系統本地,雙擊打開

點擊安裝:

點擊下一步:
選擇自定義證書集合,點擊瀏覽:

選擇第二個,受信任的證書列表,一直下一步/完成/是的等,就可以了。
成功后效果如圖:

一開始那個X已經沒有了。

Status顯示OK。
如果你想看到證書集合的情況,可以WIN+R -> certmgr.msc查看

名字是CA證書的Common Name。
最后(如果沒有域名),修改以下hosts文件模擬一下域名:

使用域名訪問,風險提示就消失了:

5.簽發客戶端證書
簽發客戶端證書,用於服務端開啟了ssl的客戶端驗證時,要求客戶端對請求做加密。
運行腳本client.sh

所有密碼處我填的全是demo。
結果如下:

到此為止,證書的生成已經全部講完了。
6.Nginx配置Https雙向認證
Https雙向認證不僅驗證服務端的證書,服務端也要驗證客戶端的證書;不僅對客戶端的請求進行了加密,並且服務端使用的加密方案也是使用客戶端公鑰加密后發送給客戶端的。比單項認證更加安全。
我個人的理解是,單項認證防止請求被篡改,雙向認證防止請求被模擬。
題外話,Https使用了對稱加密+非對稱加密,由於非對稱加密的效率低,不適合傳輸的數據量大的時候。所以Https的客戶端將對稱加密的密鑰用服務端的公鑰進行加密再發送給服務端,服務端用私鑰進行解密(非對稱加密),對傳輸數據本身的加密使用的密鑰是一樣的(對稱加密)。
進入正題,首先開啟服務端nginx的客戶端ssl認證,將之前加入的配置刪除,貼入新的一份:
server { server_name ssl.demo.com; listen 443; ssl on; ssl_certificate ca-demo/server/server.crt; ssl_certificate_key ca-demo/server/server.key; ssl_client_certificate ca-demo/ca.crt; ssl_verify_client on; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }
檢查並重啟,再次訪問:

顯示未發送客戶端證書。
下載client.p12文件到本地,雙擊安裝,這次安裝到個人:

關閉瀏覽器再次訪問,就有了證書選擇的界面,選擇后正常訪問。

之前有不少網銀都是使用這種方式進行交易的。
7.使用Java訪問雙向認證的Https資源
下一篇再講...
未完待續...
To be Continued...
下一篇在這兒:http://www.cnblogs.com/dreamingodd/p/7491098.html
本文的相關源碼位於 https://github.com/dreamingodd/CA-generation-demo
dreamingodd原創文章,如轉載請注明出處。
