Https安全協議的由來? 在實現 HTTPS協議前,咱們須要瞭解 SSL 協議,但其實咱們如今使用的更多的是 TLS 加密通信協議。 那麼TLS是怎麼保證實文消息被加密的呢?在OSI七層模型中,應用層是http協議,那麼在應用層協議之下,咱們的表示層,也就是 SSL 協議所發揮做用的一層,它經過(握手、交換祕鑰、告警、加密)等方式,使應用層 HTTP 協議沒有感知的狀況下作到了數據的安全加密。 php
#####Nginx配置示例(單向)html
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的公鑰證書來驗證客戶端證書。windows
雙向驗證的過程: 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下,雙擊便可安裝。