Https安全協議的由來?
在實現 HTTPS協議前,我們需要了解 SSL 協議,但其實我們現在使用的更多的是 TLS 加密通訊協議。
那么TLS是怎么保證明文消息被加密的呢?在OSI七層模型中,應用層是http協議,那么在應用層協議之下,我們的表示層,也就是 SSL 協議所發揮作用的一層,它通過(握手、交換秘鑰、告警、加密)等方式,使應用層 HTTP 協議沒有感知的情況下做到了數據的安全加密。
Nginx配置示例(單向)
server {
listen 443 ssl;
server_name www.oldxu.com;
index index.html index.php;
root /code;
ssl on;
ssl_certificate server.crt;
ssl_certificate_key server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!eNULL;
ssl_prefer_server_ciphers on;
...
}
Nginx配置雙向認證
單向認證,僅僅是客戶端需要檢驗服務端證書是否是正確的,而服務端不會檢驗客戶端證書是否是正確的。
雙向認證,指客戶端驗證服務器端證書,而服務器也需要通過CA的公鑰證書來驗證客戶端證書。
雙向驗證的過程:
1.客戶端say hello 服務端
2.服務端將證書、公鑰等發給客戶端
3.客戶端CA驗證證書,成功繼續、不成功彈出選擇頁面
4.客戶端將自己的證書和公鑰發送給服務端
5.服務端驗證客戶端證書,如不通過直接斷開連接
6.客戶端告知服務端所支持的加密算法
7.服務端選擇最高級別加密算法使用客戶端公鑰加密后發送給客戶端
8.客戶端收到后使用私鑰解密並生成隨機對稱密鑰key,使用服務端公鑰加密發送給服務端
9.服務端使用私鑰解密,獲取對稱密鑰key
10.后續客戶端與服務端使用該密鑰key進行加密通信
#####服務端操作
server {
listen 443 ssl;
server_name www.oldxu.com;
index index.html index.php;
root /code;
ssl on;
ssl_certificate server.crt;
ssl_certificate_key server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!eNULL;
ssl_prefer_server_ciphers on;
ssl_client_certificate ca.crt; //這里的ca.crt是根證書公鑰文件
ssl_verify_client on;
...
}
#####客戶端(瀏覽器)操作
如果不進行以下操作,瀏覽器會出現400錯誤。400 Bad Request(No required SSL certificate was sent)
# cd /etc/pki/ca_test/client
# openssl genrsa -out client.key //生成私鑰文件
# openssl req -new -key client.key -out client.csr //生成請求文件,填寫信息需要和ca.csr中的Organization Name保持一致
# openssl ca -in client.csr -cert /etc/pki/ca_test/root/ca.crt -keyfile /etc/pki/ca_test/root/ca.key -out client.crt -days 3650
//簽名client.csr, 生成client.crt,此步如果出現
#1.將client.key轉換為pfx(p12)格式
# cd /etc/pki/ca_test/client
# openssl pkcs12 -export -inkey client.key -in client.crt -out client.pfx //這一步需要輸入一個自定義密碼,一會在windows上安裝的時候要用到,需要記一下。
#2.將client.pfx拷貝到windows下,雙擊即可安裝。