在Nginx上為你的網站加入Https

Zneu Ray
10 min readFeb 25, 2017

--

從今年起Google將開始主動推廣https(來源),因此只要你使用的是Chrome瀏覽器,就會看到Google將還是使用http但包含敏感資訊如密碼或信用卡等的網站標示為不安全,開個空網站加入密碼欄位就可以看到下圖的結果

那麼就來為你的網站加入https吧

製作ssl憑證(certificate)

Https指的就是http透過ssl加密,所以我們第一步要先來製作我們的ssl憑證,首先在系統輸入

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout demo.key -out demo.csr
  • req -x509 : 指定request要使用X.509憑證驗證
  • -nodes : 產生的憑證不需要密碼,不然每重新啟動nginx就要輸入一次
  • -days : 有效日期,3650表示約10年
  • -newkey rsa:2048 : 我們需要同時產生csr(certificate singing request)與key(private key)檔並使用2048 bits的RSA加密
  • -keyout : key輸出的位置與檔名,這裡測試填 demo.key ,請自行更換
  • -out : csr輸出的位置與檔名,這裡測試填 demo.csr ,請自行更換

輸入完後會出現以下內容需要填寫

Country Name (2 letter code) [AU]:TW  # 國碼State or Province Name (full name) [Some-State]:Taiwan  # 國或洲名Locality Name (eg, city) []:Taichung  # 城市名Organization Name (eg, company) [Internet Widgits Pty Ltd]:Demo  # 組織或公司名Organizational Unit Name (eg, section) []: # 公司單位名Common Name (e.g. server FQDN or YOUR name) []:www.demo.com # 網域名Email Address []:demo@demo.com  # Email

要特別注意的是Common Name千萬不要填錯,https是根據你Common Name與你目前進入網站的domain是否符合,你購買的domain是demo.com就必需填入對應你需要加入https的主機如 : www.demo.com

填完後就會產生 demo.keydemo.csr ,內容會長這樣

# demo.key
-----BEGIN RSA PRIVATE KEY-----
xxx
-----END RSA PRIVATE KEY-----
# demo.csr
-----BEGIN CERTIFICATE-----
xxx
-----END CERTIFICATE-----

也可以透過指令來查看產生的csr檔實際內容

openssl x509 -in demo.csr -text

可看到剛剛輸入的內容都記錄在csr內

Certificate:Data:Version: 3 (0x2)Serial Number:a8:af:34:4f:b4:b3:80:b5Signature Algorithm: sha1WithRSAEncryptionIssuer: C=TW, ST=Taiwan, L=Taichung, O=Demo, CN=www.demo.com/emailAddress=demo@demo.comValidityNot Before: Feb 23 17:40:31 2017 GMTNot After : Feb 21 17:40:31 2027 GMTSubject: C=TW, ST=Taiwan, L=Taichung, O=Demo, CN=www.demo.com/emailAddress=demo@demo.comSubject Public Key Info:Public Key Algorithm: rsaEncryptionRSA Public Key: (2048 bit)... 以下略

購買ssl憑證

在剛剛已經製作出ssl憑證了,但如果這樣就可以自行製作的話那也太沒信用,因此我們要透過第三方機構來驗證你的憑證的真實性,就要你花錢就是了。

有提供驗證的機構非常多,如GoDaddy、Comodo等,每家價錢也都不一樣,可挑選喜歡的或多比價。購買的方案大致上可分為3種

  1. Standard(一般) : 最便宜的方案,只可對應一組網址,如果你只有一個網站需要就買這個吧,價格一年約3千上下,在網址列可看到綠色的安全字樣
  2. EV : 較嚴格的驗證方案,價格一年約5千上下,網址列會顯示綠色的驗證機構名稱,例如我們現在看Medium就是由 A Medium Corporation [US] 驗證
  3. Wildcard(萬用字元) : 可以對應一組網址及底下的所有子網域,有多個服務在同個網址下的話可以考慮這個,價格一年約1萬

購買過程需要將你的csr的內容貼上或上傳,購買完成後你應該會收到2個檔案

  1. 主要crt檔,檔名一般是你申請的網域名如: www_demo_com.crt
  2. bundle檔,又稱為intermediate certificate

不過有些網站可能會直接提供 .pem 檔,這個檔案其實就是把crt與bundle合併後的檔案,而如果你拿到是分開的兩個檔案你也需要將他合併為1個,可使用以下方式合併

cat www_demo_com.crt www_demo_com.bundle >> www_demo_com.pem

完成以上動作後就可以將你的key與pem上傳到server上

Nginx設定

Nginx的設定是以每個block來區分,加入ssl大致上會用到以下的設定,我把它分為2部份,最下方是你的server設定,再依照自已的需求調整吧

server {  # 1. basic parts
listen 443 ssl default_server;
ssl on;
ssl_certificate /home/demo/certs/demo.pem;
ssl_certificate_key /home/demo/certs/demo.key;
ssl_session_timeout 5m;
#ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 2. advance parts
#ssl_ciphers HIGH:!aNULL:!MD5;
ssl_ciphers '...';
ssl_dhparam /home/demo/certs/dhparam.pem;
ssl_prefer_server_ciphers on;
# server setting
server_name www.demo.com
...
}

1. SSL基本設定

  • listen : 指定要監聽的port,一般是443
  • ssl : 啟用ssl
  • ssl_certificate : 指定剛剛購買後合併完並傳到server的.pem檔
  • ssl_certificate_key : 指定你上傳到server的private key
  • ssl_protocols : 原始的設定可能是 SSLv2 等(如註解部份),這是舊版的安全協定,將它更新成新版 TLS ,可提供更安全的加密連線,不過要注意如果你的網站是要讓非常舊的系統如Windows XP的IE來使用的話可能還是需要提供舊版的方式

到這裡的設定調整完就算完成了,這時你的網站已經可以提供https,另外也可以上SSL測試網站Qualys SSL Labs去測你網站的安全等級,應該可以拿到A級了

第1項的certificate有達到100分就代表你的ssl有驗證過了,如果有其它的安全問題都會列在上面,照上面的問題去修正很容易就可以加強你網站的安全性

2. 進階設定

如果想要讓你的網站更安全可以再加上cipher與dhparams,cipher有非常多種,全加上就可以了

ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

再來產生dhparams並上傳到你的server加入設定即可

openssl dhparam -out dhparam.pem 4096

完成後可以看到安全等級提升到A+了

最後如果你需要將透過http連線到你網站的人直接轉到https的話可以再加入設定,記得加到一個新的server block,不要跟上面設定放在同個block

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}

References

--

--