HTTP與HTTPS區別、nginx配置

協議層瞭解:php

概念描述:html

SSL層是如何加密的,咱們都知道非對稱加密,通常網站若是但願支持https就須要向權威機構購買證書,證書包含一個公鑰和私鑰對,公鑰發送給客戶端,客戶端使用這個公鑰進行加密,服務端使用私鑰進行解密,那麼有人會問了,爲何還要向權威機構申請呢,本身構造一個得了唄,能夠的, 若是你只是本身使用,可是若是你想讓不少人都使用,這些人又不認識你,怎麼辦呢?你怎麼證實你是你呢?這個時候權威機構就派上用場了,咱們安裝的瀏覽器默認都是信任一些主流的權威機構的,他給你發了證書,你就能夠證實你是你了nginx

工做流程的簡單描述: git

HTTP 缺省工做在TCP協議80端口,用戶訪問網站http:// 打頭的都是標準HTTP服務,HTTP所封裝的信息是明文的,經過抓包工具能夠分析其信息內容,若是這些信息包含有你的銀行卡賬號、密碼,你確定沒法接受這種服務,那有沒有能夠加密這些敏感信息的服務呢?那就是HTTPS!github

HTTPS缺省工做在TCP協議443端口,它的工做流程通常如如下方式:算法

1) 完成TCP三次同步握手
2) 客戶端驗證服務器數字證書,經過,進入步驟3
3) DH算法協商對稱加密算法的密鑰、hash算法的密鑰
4) SSL安全加密隧道協商完成
5)網頁以加密的方式傳輸,用協商的對稱加密算法和密鑰加密,保證數據機密性;用協商的hash算法進行數據完整性保護,保證數據不被篡改shell

若是HTTPS是網銀服務,以上SSL安全隧道成功創建纔會要求用戶輸入帳戶信息,帳戶信息是在安全隧道里傳輸,因此不會泄密! 後端

給Nginx配置自簽名證書:瀏覽器

(原文來自:http://www.liaoxuefeng.com/article/0014189023237367e8d42829de24b6eaf893ca47df4fb5e000) 安全

要保證Web瀏覽器到服務器的安全鏈接,HTTPS幾乎是惟一選擇。HTTPS其實就是HTTP over SSL,也就是讓HTTP鏈接創建在SSL安全鏈接之上。

SSL使用證書來建立安全鏈接。有兩種驗證模式:

  1. 僅客戶端驗證服務器的證書,客戶端本身不提供證書;

  2. 客戶端和服務器都互相驗證對方的證書。

顯然第二種方式安全性更高,通常用網上銀行會這麼搞,可是,普通的Web網站只能採用第一種方式。

客戶端如何驗證服務器的證書呢?服務器本身的證書必須通過某「權威」證書的簽名,而這個「權威」證書又可能通過更權威的證書籤名,這麼一級一級追溯上去,最頂層那個最權威的證書就稱爲根證書。根證書直接內置在瀏覽器中,這樣,瀏覽器就能夠利用本身自帶的根證書去驗證某個服務器的證書是否有效。

若是要提供一個有效的證書,服務器的證書必須從VeriSign這樣的證書頒發機構簽名,這樣,瀏覽器就能夠驗證經過,不然,瀏覽器給出一個證書無效的警告。

申請一個證書籤名的費用是一年幾十~幾百刀不等,因此若是隻是出於管理目的,能夠建立自簽名證書,保證管理員經過瀏覽器安全鏈接到服務器。

下面簡單介紹如何建立一個自簽名的SSL證書。

建立自簽名證書須要安裝openssl,使用如下步驟:

  1. 建立Key;

  2. 建立簽名請求;

  3. 將Key的口令移除;

  4. 用Key簽名證書。

爲HTTPS準備的證書須要注意,建立的簽名請求的CN必須與域名徹底一致,不然沒法經過瀏覽器驗證。

以上步驟命令繁瑣,因此我作了一個shell腳本,能一次性把證書搞定。從這裏下載腳本:

https://github.com/michaelliao/itranswarp.js/blob/master/conf/ssl/gencert.sh

運行腳本,假設你的域名是www.test.com,那麼按照提示輸入:

$ ./gencert.sh 
Enter your domain [www.example.com]: www.test.com          
Create server key...
Generating RSA private key, 1024 bit long modulus
.................++++++
.....++++++
e is 65537 (0x10001)
Enter pass phrase for www.test.com.key:輸入口令
Verifying - Enter pass phrase for www.test.com.key:輸入口令
Create server certificate signing request...
Enter pass phrase for www.test.com.key:輸入口令
Remove password...
Enter pass phrase for www.test.com.origin.key:輸入口令
writing RSA key
Sign SSL certificate...
Signature ok
subject=/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=www.test.com
Getting Private key
TODO:
Copy www.test.com.crt to /etc/nginx/ssl/www.test.com.crt
Copy www.test.com.key to /etc/nginx/ssl/www.test.com.key
Add configuration in nginx:
server {
    ...
    ssl on;
    ssl_certificate     /etc/nginx/ssl/www.test.com.crt;
    ssl_certificate_key /etc/nginx/ssl/www.test.com.key;
}

注意4次輸入的口令都是同樣的。

腳本註釋:

// 建立自當前日期起爲期10年的根證書

openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt

在當前目錄下會建立出4個文件:

  • www.test.com.crt:自簽名的證書
  • www.test.com.csr:證書的請求
  • www.test.com.key:不帶口令的Key
  • www.test.com.origin.key:帶口令的Key

Web服務器須要把www.test.com.crt發給瀏覽器驗證,而後用www.test.com.key解密瀏覽器發送的數據,剩下兩個文件不須要上傳到Web服務器上。

以Nginx爲例,須要在server {...}中配置:

server {
    ...
    ssl on;
    ssl_certificate     /etc/nginx/ssl/www.test.com.crt;
    ssl_certificate_key /etc/nginx/ssl/www.test.com.key;
}

若是一切順利,打開瀏覽器,就能夠經過HTTPS訪問網站。第一次訪問時會出現警告(由於咱們的自簽名證書不被瀏覽器信任),把證書經過瀏覽器導入到系統(Windows使用IE導入,Mac使用Safari導入)並設置爲「受信任」,之後該電腦訪問網站就能夠安全地鏈接Web服務器了:

self-signed-cert

如何在應用服務器中配置證書呢?例如Tomcat,gunicorn等。正確的作法是不配置,讓Nginx處理HTTPS,而後經過proxy以HTTP鏈接後端的應用服務器,至關於利用Nginx做爲HTTPS到HTTP的安全代理,這樣即利用了Nginx的HTTP/HTTPS處理能力,又避免了應用服務器不擅長HTTPS的缺點。

沃通申請免費的 ssl 證書 (重要項目仍是建議申請付費)

https://freessl.wosign.com/

首先:註冊,登陸,申請的SSL證書都將以訂單形式存取;

其次:驗證服務器域名,方式有兩種(txt or cname);

最後:申請證書,方式也有兩種(1.本身生成,上傳;2. 沃通替你生成 <我選這種> )

部署:把證書文件存放到對應目錄,在nginx的 .conf 文件中

listen 80;
    listen 443 ssl;

    server_name  test.com  www.test.com ;
    set $root_path '/root_path/test.com';
    root $root_path;

    ssl_certificate      /certs/www.test.com_bundle.crt;
    ssl_certificate_key  /certs/www.test.com.key;
    ssl_session_timeout  5m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS;
    ssl_prefer_server_ciphers   on;

    index index.php index.html index.htm;
    try_files $uri $uri/ @rewrite;
...
...

找了個SSL安全說明,有熱情能夠繼續深刻了解。

http://www.open-open.com/lib/view/open1430794673710.html

相關文章
相關標籤/搜索