前言
考慮到HTTP的安全性問題,現在很多網站已經將HTTP升級到了HTTP + SSL(HTTPS)。
但也並不是所有的HTTPS站點就是安全的,也可能存在中間人的攻擊(不是權威的CA機構頒發的證書以及證書校驗不嚴格)。下圖就是關於“中間人攻擊”的原理圖。
不過權威CA機構頒發證書大多數是收費的,想用免費的可以考慮 Let's Encrypt。
什么才是權威呢?
就是CA機構向瀏覽器廠商申請,申請通過后,由瀏覽器廠商將CA機構的根證書(簡稱CA證書)內嵌在瀏覽器中。也就是那些為企業簽發證書的CA證書都是受瀏覽器信任的。
而證書一般有三種,根證書、服務器證書、客戶端證書。
根證書是生成服務器證書和客戶端證書的基礎,也就是CA證書。
服務器證書是放在服務器上的,並引入到站點的配置文件中,由CA證書簽名。相當於有一封信件(服務器證書),由CA蓋章(簽名),表示此信件受CA信任。
客戶端證書是對於個人的,這里不做演示。
這樣就可以防御中間人攻擊了,當客戶端發起HTTPS請求時,服務器將服務器證書傳給客戶端,客戶端用內嵌的CA證書和獲取到的服務器證書做信息比較,如果發現是偽造的證書,客戶端發出警告。
接下來就模擬下整個證書生成的環節,可以有一個清楚的認識。因為是本地環境,就自建CA根證書了(Let's Encrypt 有域名驗證之類的步驟)。
根證書(CA證書)
openssl version -a //openssl所有安裝信息
cd /usr/lib/ssl
cd /etc/ssl //到Linux專門的配置目錄中設置CA
mkdir req //放服務器證書
mkdir newcert //放簽名后的服務器證書
cp openssl.cnf cacert.cnf
vim cacert.cnf
修改v3_ca 下面設置項。
修改v3_req的設置項, DNS參數值為要升級為HTTPS的域名。
開啟 v3_req(去掉 #)。
生成根證書的私鑰
openssl genrsa -aes256 -out private/cakey.pem 2048 //用-aes256加密生成cakey.pem私鑰,密碼記住后面要用
生成根證書CA (自簽)
openssl req -new -x509 -subj "/C=CN/CN=FocusChina Corporation Root CA/ST=JiangSu/L=NanJing/O=FocusChina/OU=FC" -extensions v3_ca -days 3650 -key private/cakey.pem -sha256 -out cacert.pem -config cacert.cnf
查看CA證書
openssl x509 -in cacert.pem -text -noout

Issuer與Subject一致
以上CA根證書建立完成,下面就可以給相應的服務器證書簽名。
服務器證書
cd /etc/nginx/ssl/ //這里將服務器證書放在 /etc/nginx/ssl 目錄下。
生成服務器證書私鑰 (www.app.goods)
openssl genrsa -out www.app.goods.key 2048
生成服務器證書
openssl req -subj "/C=CN/CN=app.goods/ST=JiangSu/L=NanJing/O=FocusChina/OU=FC" -extensions v3_req -sha256 -new -key www.app.goods.key -out www.app.goods.csr
CN的值為服務器名,其他的和根證書保持一致。
cp www.app.goods.csr /etc/ssl/req
服務器證書生成后,就可以將相關信息(公司信息、服務器證書,域名等)交給CA機構,CA機構會根據提供的信息去驗證公司信息、域名是否屬實。接下來,給服務器證書簽名。
簽名
在前面已經建立了自己的CA證書,下面就用生成的CA證書給服務器簽名。
簽名
openssl x509 -req -extensions v3_req -days 3650 -sha256 -in ./req/www.app.goods.csr -CA cacert.pem -CAkey private/cakey.pem -CAcreateserial -out ./newcert/www.app.goods.crt -extfile cacert.cnf //用CA證書、CA私鑰、服務器證書生成www.app.goods.crt,有效期10年
查看證書
openssl x509 -in ./newcert/www.app.goods.crt -text -noout
cp ./newcert/www.app.goods.crt /etc/nginx/ssl //將簽名后的證書交給服務器
配置服務器
cd /etc/nginx/conf.d
vim www.app.goods.conf
ssl 監聽端口為443, 開啟ssl,並加載服務器證書私鑰以及證書。
service nginx restart //重啟服務
https://www.app.good //chrome 打開網站
頁面出現“您的連接不是私密連接”,是因為自建的根證書或者服務器證書不被瀏覽器信任。
導出根證書
cd /etc/ssl
sz cacert.pem //發送到桌面。
Google 設置 高級 > 管理證書 受信任的根證書頒發機構 > 導入cacert.pem
運行 > certmgr.msc //chrome用的是window系統的證書管理
刷新 https://www.app.goods/
chrome、IE等已成功
Firefox 用的不是window系統的證書管理,需要導入到瀏覽器
Firefox 選項 > 隱私與安全 查看證書 > 導入cacert.pem 證書頒發機構 (下載證書 勾選第一個框)
至此,HTTPS部署成功
強制HTTP跳轉
service nginx restart //重啟服務