如何在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并将其粘贴到激活页面中:
提交数据后,系统会要求您确认。现在是验证您实际拥有域名的时候了。通常有三种不同的方式验证您是否拥有一个域:电子邮件,基于HTTP或基于DNS。为您选择最合适的选项。在我的情况下,它是基于DNS。
访问详细信息页面以获取创建CNAME的说明(以防您选择了基于DNS的验证)。
添加具体给定值的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提供所有请求:
最后,添加一些额外的配置到您的settings.py:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
重新启动您的Django应用程序,并且使它全部生效。