CentOS7:部署完的Django項目升級為HTTPS
- 2020 年 3 月 5 日
- 筆記
一、Let』s Encrypt免費證書
(1.預先工作
在創建證書之前,在項目根目錄下(manage.py文件所在目錄)創建文件夾:/.well-know,在改文件夾下創建文件:acme-challenge。
(2.配置Nginx
安裝完Certbot 之後,需要簡單配置Nginx以便Let's Encrypt能起作用。
sudo vim /etc/nginx/conf.d/addcoder.conf
# Django網站配置 server { # 設置監聽埠號 listen80; # 設置對外訪問入口,可以是域名可以是公網IP server_nameaddcoder.com www.addcoder.com; # 設置訪問的語言編碼 charsetUTF-8; # 訪問日誌記錄 access_log/var/log/nginx/addcoder_access.log; # 錯誤日誌記錄 error_log/var/log/nginx/addcoder_error.log; # 設置虛擬主機的基本資訊 location / { include uwsgi_params; # 剛才uwsgi設置的socket uwsgi_pass 127.0.0.1:8080; uwsgi_read_timeout 2;} # 靜態文件設置,nginx自己處理 location/static { # 過期時間 expires 30d; # 項目靜態文件地址 alias /srv/addcoder/static/;} # 創建SSL證書臨時文件 location /.well-known/acme-challenge { alias /srv/addcoder/.well-known/acme-challenge;} # 配置nginx502錯誤配置 error_page 502 /502.html; location = /502.html { root/usr/share/nginx/html;} # 配置nginx404錯誤配置 error_page 404 /404.html; location = /404.html { root/usr/share/nginx/html;} }(3.重啟nginx,以便生效。
systemctl restart nginx
(4.安裝certbot
sudo yum install -y certbot
(5.簽發 SSL 證書
兩種生成證書的方式
1.standalone
certbot 會啟動自帶的 nginx(如果伺服器上已經有nginx或apache運行,需要停止已有的nginx或apache)生成證書。
certbot certonly --standalone -d addcoder.com -d www.addcoder.com
2.webroot(推薦)
certbot certonly --webroot -w /srv/addcoder -d addcoder.com -d www.addcoder.com
-w:指定項目絕對路徑。
-d:指定生成證書域名,不可以直接寫IP。
這條命令的輸出類似於這樣(有Congratulations)為成功。
證書存儲於 /etc/letsencrypt/live/addcoder.com/fullchain.pem
(4.如果遇到 ImportError: No module named 'requests.packages.urllib3' 報錯
原因:
requests庫版本問題
解決方法
pip install --upgrade --force-reinstall 'requests==2.6.0'
(5.生成前向安全性密鑰
cd /etc/letsencrypt/archive/addcoder.com
openssl dhparam 2048 -out dhparam.pem
二、Nginx
1、配置
server { listen80; server_name47.94.245.242 addcoder.com; return 301https://www.addcoder.com; } server { # 設置監聽埠號 listen80; listen443; # 設置對外訪問入口,可以是域名可以是公網IP server_name www.addcoder.com; # HTTP請求301永久跳轉到HTTPS if ($server_port = 80) { return 301 https://$server_name$request_uri;} # HTTPS設置 allowall; ssl on; # 指定證書文件 ssl_certificate /etc/letsencrypt/live/addcoder.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/addcoder.com/privkey.pem; # 前向安全性 ssl_dhparam /etc/letsencrypt/archive/addcoder.com/dhparam.pem; # 使用ssl模組配置支援HTTPS訪問 ssl_prefer_server_ciphers on; ssl_session_timeout 5m; # PCI DSS支付卡行業安全標準,禁用不安全的SSLv1 2 3,只使用TLS,PCI安全標準委員會規定開啟TLS1.0將導致PCI DSS不合規,推薦配置. ssl_protocols TLSv1.1 TLSv1.2; # 需要配置符合PFS規範的加密套件,推薦配置. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE; # HSTS(HTTP嚴格傳輸安全)的 max-age 需要大於15768000秒,推薦配置. add_header Strict-Transport-Security "max-age=31536000"; # 設置訪問的語言編碼 charset UTF-8; # 訪問日誌記錄 access_log/var/log/nginx/addcoder_access.log; # 錯誤日誌記錄 error_log/var/log/nginx/addcoder_error.log; # 設置虛擬主機的基本資訊 location / { include uwsgi_params; # 剛才uwsgi設置的socket uwsgi_pass 127.0.0.1:8080; uwsgi_read_timeout 2;} # 靜態文件設置,nginx自己處理 location /static { # 過期時間 expires 30d; # 項目靜態文件地址 alias /srv/addcoder/static/;} # 創建SSL證書臨時文件 location /.well-known/acme-challenge { alias /srv/addcoder/.well-known/acme-challenge;} # 配置nginx502錯誤配置 error_page 502 /502.html; location = /502.html { root/usr/share/nginx/html;} # 配置nginx404錯誤配置 error_page 404 /404.html; location = /404.html { root/usr/share/nginx/html;} }2、重啟nginx,以便生效。
systemctl restart nginx
三、Let』s Encrypt 續期
certbot renew
四、Let』s Encrypt 自動續期
Let』s Encrypt 的證書90天就過期了,所以,我們還需要設置自動化更新腳本。
編輯當前用戶的定時作業:
crontab -e
1.改變通知郵件目的地
2.加入作業
00 18 * * 5 certbot renew --deploy-hook "systemctl restart nginx"
這裡是每周 5 的 18 點 00 分嘗試更新證書,如果證書在 30 天內到期,則會更新證書,否則不會更新, --deploy-hook選項表示在更新成功以後才運行重載 nginx 的命令。
crontab 六個欄位含義:
minute: 表示分鐘,(整數 0 -59)。
hour:表示小時,可以是從0到23之間的任何整數。
day:表示日期,可以是從1到31之間的任何整數。
month:表示月份,可以是從1到12之間的任何整數。
week:表示星期幾,可以是從0到7之間的任何整數,這裡的0或7代表星期日。
command:要執行的命令,可以是系統命令,也可以是自己編寫的腳本文件。
如果欄位使用 * 號,如month欄位為 * 號,則為滿足其他欄位約束的每月都執行該命令。
