項目中需要搭建一個server和client基於證書的雙向認證環境。由我來做,我也不會。
經過一晚上的研究,基本摸清了(知其然不知其所以然)。做下筆記。
基本環境:
1.安裝nginx。
2.安裝openssl。
生成證書:
首先建立一個工作目錄,這里以我的工作目錄為例。(/home/myca/),然后執行如下命令。建立生成證書的路徑文件結構,這是由openssl的默認配置文件決定的。你可以修改配置。
mkdir demoCA cd demoCA touch ./{serial,index.txt} echo '01' > serial mkdir ./newcerts cd ..
拷貝配置文件到工作目錄。當然前綴路徑要換成你自己的。
cp /usr/local/ssl/openssl.cnf ./
修改配置文件。編輯openssl.cnf中的一些選項。
unique_subject = no (這樣一個CA可以同時簽多張證書)
countryName = optional(把這些參數的匹配規則改為可選)
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
現在我們來生成自己的CA。
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
生成會話會讓你填入一些參數,紅線標出的是要輸入的,根據實際情況填寫。執行完會發現工作目錄下會有ca.crt ca.key兩個文件。截圖如下:
接下來生成server端證書。
首先生成server端私鑰。執行后會要求輸入解析私鑰文件的密碼,根據個人喜好設置。生成server.key。
openssl genrsa -des3 -out server.key 1024
生成證書請求。生成會話會提示輸入一些請求信息,成功后生成server.csr。
openssl req -new -key server.key -out server.csr -config openssl.cnf
注意紫色線條標出的一行,這行輸入server端的域名(https://192.168.68.173:8080是我的服務器地址)。否則簽發的證書會被瀏覽器視為不是本站點的證書。其他根據情況。
現在用生成的CA給證書請求(server.csr)簽發證書。根據提示輸入相關密碼(之前設置好的)和y(yes),成功后生成證書server.crt
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
到這里,我們已經可以做單項認證了,來試試。
配置nginx:vi /usr/local/nginx/conf/nginx.conf修改配置如下圖(注意證書和CA的路徑是我的工程路徑):
保存后啟動nginx,會要求輸入server端私鑰文件解析密碼,輸入生成時設置的密碼。
在windows下打開firefox輸入https://192.168.68.173:8080回車。
這說明nginx已經向瀏覽器發送了自己的證書,但是這個證書不受信任。別急,現在我們把之前自己的CA導入瀏覽器。
打開 選項->高級->查看證書->證書機構->導入。先擇CA后根據提示導入證書。成功后如下:
再次輸入https://192.168.68.173:8080回車。
看見中間那行提示了嗎?中式英語翻譯過來就是-->沒有要求的ssl證書來發送。也就是說,client已經成功認證了server端的證書,但是我們配置nginx為雙向認證,所以nginx要求瀏覽器出示證書,而瀏覽器沒有證書。
說明單項認證已經OK,現在為client生成證書。
首先生成client端私鑰,執行后會要求輸入解析私鑰文件的密碼,根據個人喜好設置。生成client.key。
openssl genrsa -des3 -out client.key 1024
生成證書請求。生成會話會提示輸入一些請求信息,成功后生成client.csr。
openssl req -new -key client.key -out client.csr -config openssl.cnf
現在用之前生成的CA給證書請求(client.csr)簽發證書。根據提示輸入相關密碼(之前設置好的)和y(yes),成功后生成證書client.crt
openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
firefox要求客戶端的證書格式是p12格式,所以我們把client.crt轉化為client.p12格式
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
轉pem格式
cat ca.crt ca.key > ca.pem cat server.crt server.key > server.pem cat client.crt client.key > client.pem
最后一步,把client.p12導入瀏覽器。
打開 選項->高級->查看證書->您的證書->導入。根據提示導入,導入成功后如圖:
輸入https://192.168.68.173:8080回車。
OK!!!