給Nginx配置一個自簽名的SSL證書


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

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

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

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

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

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

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

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

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

建立自簽名證書須要安裝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次輸入的口令都是同樣的。

在當前目錄下會建立出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的缺點。

相關文章
相關標籤/搜索