如何在Nginx上为Django应用程序设置SSL证书

2017-08-25

nginx django ssl

(图片:http://www.lifeofpix.com/gallery/padlock/)

使用HTTPS的Django应用程序对于保护用户数据非常重要。如果您的应用程序具有用户身份验证,则只是开始使用HTTPS的一个很好的理由。否则用户名和密码将以明文方式通过HTTP显示。意思是说如果用户正在使用公共互联网连接,并且他登录到您的应用程序,他很容易受到嗅探器的攻击。

重要的是不仅可以使用HTTPS来保护登录,密码更改和支付页面,而且可以保护整个Django应用程序。否则,您只会暂时保护您的用户群。

在本教程中,将引导您完成所有必要的步骤,以正确保护Django应用程序,并使用Namecheap的廉价SSL证书。


获取SSL证书

第一步是为您的Django应用程序获取SSL。有几个选项:您可以生成自己的证书,您可以从Let’s Encrypt获得免费的证书,也可以从互联网上的许多公司购买。

在本教程中,我将使用由Namecheap注册的Positive SSL的简单商业SSL证书。你可以以每年59.95人民币购买 点击这里


生成CSR代码

CSR代表证书签名请求,它是通常在服务器端生成的base64编码数据。

由于我们将使用Nginx作为Web服务器,所以我们将使用openssl。

通常,CSR openssl配置默认包含如下所示的详细信息:

  • 通用名称(域名证书应发放)
  • 国家
  • 州(或省)
  • 地点(或城市)
  • 组织
  • 组织单位(部门)
  • 电子邮件地址

要生成CSR代码,请在服务器终端中运行以下代码:

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

提示:

将simpleacademy替换为您的域名。

进入之后,你应该会看到类似的东西:

.............+++
....................................+++
writing new private key to 'simpleacademy.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:

您会被提示几个问题:

Country Name (2 letter code) [AU]:FI
State or Province Name (full name) [Some-State]:Oulu
Locality Name (eg, city) []:Oulu
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Simple is Better Than Complex
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:simple.academy
Email Address []:admin@simpleisbetterthancomplex.com

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

回答所有问题后,检查文件是否正确创建:

ubuntu@simpleacademy:~$ ls -l
total 8
-rw-rw-r-- 1 ubuntu ubuntu 1196 May 11 14:26 simpleacademy.csr
-rw-rw-r-- 1 ubuntu ubuntu 1704 May 11 14:26 simpleacademy.key
ubuntu@simpleacademy:~$

激活SSL证书

复制文件的内容simpleacademy.csr并将其粘贴到激活页面中:

ssl

提交数据后,系统会要求您确认。现在是验证您实际拥有域名的时候了。通常有三种不同的方式验证您是否拥有一个域:电子邮件,基于HTTP或基于DNS。为您选择最合适的选项。在我的情况下,它是基于DNS。

访问详细信息页面以获取创建CNAME的说明(以防您选择了基于DNS的验证)。

域控制验证

添加具体给定值的CNAME记录: 为DCV创建CNAME记录

提示:

基于DNS的方法通常需要一段时间才能确认。如果可能,最好使用电子邮件或基于HTTP。


安装SSL证书

您的证书激活过程后,您应该在您的电子邮件地址中收到必要的证书文件。它通常在包含文件的.zip存档中:

  • simple_academy.crt
  • simple_academy.ca-bundle

连接这两个文件:

cat simple_academy.crt simple_academy.ca-bundle >> simple_academy_cert_chain.crt

将这些文件上传到您的服务器scp

scp simple_academy_cert_chain.crt ubuntu@xxx.xxx.xxx.xxx:/home/ubuntu

现在你需要两个文件:

  • simple_academy_cert_chain.crt
  • simpleacademy.key (在创建 csr 文件时,生成的)

将这两个文件复制到**/etc/ssl/**:

sudo cp simpleacademy_cert_chain.crt /etc/ssl/
sudo cp simpleacademy.key /etc/ssl/

编辑您的虚拟主机文件:

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/ssl/simpleacademy_cert_chain.crt;  # <-
    ssl_certificate_key /etc/ssl/simpleacademy.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;
        }
    }
}

重新启动nginx:

sudo service nginx restart

它已经可以正常访问了。但是,只能通过HTTPS提供所有请求:

simple-academy-https

最后,添加一些额外的配置到您的settings.py

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

重新启动您的Django应用程序,并且使它全部生效。

https://simpleisbetterthancomplex.com/tutorial/2016/05/11/how-to-setup-ssl-certificate-on-nginx-for-django-application.html