CentOS7:部署完的Django項目升級為HTTPS

一、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.改變通知郵件目的地

[email protected]

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欄位為 * 號,則為滿足其他欄位約束的每月都執行該命令。

Tags: