http在資料傳遞過程中沒有進行加密的動作,所以有中間人擷取到敏感資料的問題,中間人攻擊(Man-in-the-middle attack,縮寫:MITM),所以需要SSL跟TLS做加密的動作
80是一般http通用接口,443是https的接口,所以其實只要在443port上加入ssl憑證就可以了
Ref:NGINX 設定 HTTPS 網頁加密連線,建立自行簽署的 SSL 憑證
使用openssl產生ssl憑證
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
- req:使用 X.509 Certificate Signing Request(CSR) Management 產生憑證。
- -x509:建立自行簽署的憑證。
- -nodes:不要使用密碼保護,因為這個憑證是 NGINX 伺服器要使用的,如果設定密碼的話,會讓伺服器每次在啟動時書需要輸入密碼。
- -days 365:設定憑證的使用期限,單位是天,如果不想時常重新產生憑證,可以設長一點。
- -newkey rsa:2048:同時產生新的 RSA 2048 位元的金鑰。
- -keyout:設定金鑰儲存的位置。
- -out:設定憑證儲存的位置。
依照順序填:
1. 國家代碼,台灣就填 TW。
2. 州或省,台灣就填 Taiwan。
3. 城市,例如台北就填 Taipei。
4. 公司名稱。
5. 部門名稱。
6. 伺服器的 FQDN,這個一定要填寫正確,如果沒有申請網域名稱的話,也可以用 IP 位址替代。
7. E-mail 信箱。
server {
# 加入 SSL 設定
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
# 憑證與金鑰的路徑
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
# .....
}
但是有使用者從http連進來,所以需要從80轉到443,permanent
是http 301,讓瀏覽器重新訪問
- permanent(301):永久性重新定向,對搜尋引擎友好
- redirect(302):臨時性重新定向
- last:将rewrite后的地址重新在server标签执行。
- break:将rewrite后地址重新在当前的location标签执行。
关于nginx rewrtie的四种flag
server {
listen 80 default_server;
listen [::]:80 default_server;
# 導向至 HTTPS
rewrite ^(.*) https://$host$1 permanent;
}
但是ssl不會有憑證,需要跟發放憑證的供應商買,所以有Let's Encrypt這家免費提供ssl的公司,
用 nginx 建置一個 A+ 等級的 https 網頁伺服器