如何在NGINX+DJANGO平台設置SSL連線

於Django應用程式裡採用HTTPS對於保護用戶數據非常重要。 如果網頁應用程序具有用戶身份驗證,就是使用HTTPS的最好的理由。 否則,用戶名和密碼將通過HTTP以純文本格式傳播。 這意味著如果用戶使用公共互聯網連接,並且他登錄您的應用程序,他很容易受到駭客偷襲。

重要的是不僅安全的登錄,密碼更改和支付頁面與HTTPS,以及整個應用程序。 以下說明,將指導完成所有必要的步驟,以正確保護您的Django應用程式。

建立一個SSL證書

第一步是為您的Django應用程式獲取SSL證書。 有幾個選項:您可以生成自己的證書,您可以從Let’s Encrypt獲得一個免費的證書,或者您可以從互聯網上的許多公司購買一個證書。

在本教程中,我將使用從Namecheap註冊的Positive SSL的簡單商業SSL證書。

產生一個CSR代碼

CSR代表證書簽名請求,它是一個通常在服務器端生成的base64編碼數據。因為我們將使用Nginx作為web服務器,我們將使用openssl。

通常CSR openssl配置默認包含如下內容:

公共名稱(應頒發域名證書)
國家
州(或省)
地點(或城市)
組織
組織單位(部)
電子郵件地址

請在ssh的terminal上執行下列指令來產生CSR代碼:

openssl req -new -newkey rsa:2048 -nodes -keyout simpleacademy.key -out simpleacademy.csr

請注意,simpleacademy可以改為自己網域的名字
接著輸入相關訊息:

Country Name (2 letter code) [AU]:TW
State or Province Name (full name) [Some-State]:Taiwan
Locality Name (eg, city) []:Taipei
Organization Name (eg, company) [Internet Widgits Pty Ltd]:The Solar Systems Limited
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:simple.academy
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Simple is Better Than Complex

完成後就會產生兩個檔案,CSR跟KEY兩個檔案。
然後可以到NameCheap的Positive SSL來啟動有效的SSL認證金鑰。其他內容不再多做說明

安裝有效SSL金鑰

將驗證過的CSR與KEY放置到ㄧ個目錄,例如:/etc/nginx/ssl。

接著修改virtualhost的設定。

upstream simple_academy_server {
  server unix:/opt/simple_academy/run/gunicorn.sock fail_timeout=0;
}

# Redirect all non-encrypted to encrypted
server {
    server_name simple.academy;
    listen 80;
    return 301 https://simple.academy$request_uri;
}

server {
    server_name simple.academy;

    listen 443;  # <-

    ssl on;  # <-
    ssl_certificate /etc/nginx/ssl/simpleacademy_cert_chain.crt;  # <-crt所在位置
    ssl_certificate_key /etc/nginx/ssl/simpleacademy.key;  # <-key所在位置

    client_max_body_size 4G;

    access_log /opt/simple_academy/logs/nginx-access.log;
    error_log /opt/simple_academy/logs/nginx-error.log;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;  # <-這個很重要,記得加入
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://simple_academy_server;
            break;
        }
    }
}

這樣基本上就完成了!!

發佈留言