您现在的位置是:首页 > 技术分享 网站首页技术分享

部署完的Django项目升级为HTTPS

Django   服务器   https  
简介Let's Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。
部署完的Django项目升级为HTTPS

一、证书
1.阿里云免费ssl证书
远程连接阿里云服务器,将下载的证书复制到Nginx安装目录下的cert目录(需要新建)。
2.Let’s Encrypt免费证书
(1.预先工作
在创建证书之前,在项目根目录下(manage.py文件所在目录)创建文件夹:/.well-know,在改文件夹下创建文件:acme-challenge。
(2.配置Nginx
安装完Certbot 之后,需要简单配置Nginx以便Let's Encrypt能起作用。
sudo vim /etc/nginx/nginx.conf
server {
listen 80;
server_name IP或域名;
# 创建SSL证书临时文件
location /.well-known/acme-challenge {
alias /path/to/yoursite/.well-known/acme-challenge;} }
(2.安装certbot
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot
(3.签发 SSL 证书
两种生成证书的方式
1.standalone
certbot 会启动自带的 nginx(如果服务器上已经有nginx或apache运行,需要停止已有的nginx或apache)生成证书。
certbot certonly --standalone -d newcoder.top -d www.newcoder.top
2.webroot(推荐)
certbot certonly --webroot -w /srv/newcoder -d newcoder.top -d www.newcoder.top
-w:指定项目绝对路径。
-d:指定生成证书域名,不可以直接写IP。
这条命令的输出类似于这样(有Congratulations)为成功。
证书存储于 /etc/letsencrypt/live/newcoder.top/fullchain.pem
(4.生成前向安全性密钥
cd /etc/letsencrypt/archive/newcoder.top
openssl dhparam 2048 -out dhparam.pem

二、配置nginx
# 将以下域名的请求301永久跳转到www.newcoder.top
server {
listen 80;
server_name 39.106.189.108 goodsmovie.top www.goodsmovie.top;
return 301 https://www.newcoder.top;
}

# Django网站配置
server {
# 设置监听端口号
listen 80;
listen 443;
# 设置对外访问入口,可以是域名可以是公网IP
server_name newcoder.top www.newcoder.top;
# HTTP请求301永久跳转到HTTPS
if ($server_port = 80) {
return 301 https://$server_name$request_uri;
}
# HTTPS设置
allow all;
ssl on;
# 指定证书文件
ssl_certificate /etc/letsencrypt/archive/newcoder.top/fullchain1.pem;
ssl_certificate_key /etc/letsencrypt/archive/newcoder.top/privkey1.pem;
# 前向安全性
ssl_dhparam /etc/letsencrypt/archive/newcoder.top/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/newcoder_access.log;
# 错误日志记录
error_log /var/log/nginx/newcoder_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/newcoder/static/;}
# 创建SSL证书
location /.well-known/acme-challenge {
alias /srv/newcoder/.well-known/acme-challenge;}
# 爬虫协议
location /robots.txt {
alias /srv/newcoder/robots.txt;}
# 网站地图
location /sitemap.txt {
alias /srv/newcoder/sitemap.txt;}
}

三、重启nginx,以便生效。
/etc/init.d/nginx restart

四、Let’s Encrypt 自动续期
Let’s Encrypt 的证书90天就过期了,所以,我们还需要设置自动化更新脚本。
编辑当前用户的定时作业:
crontab -e
1.改变通知邮件目的地
MAILTO=820685755@qq.com
2.加入作业
45 2 * * 2 certbot renew --deploy-hook "/etc/init.d/nginx restart"
这里是每周 2 的 2 点 45 分尝试更新证书,如果证书在 30 天内到期,则会更新证书,否则不会更新, --deploy-hook选项表示在更新成功以后才运行重载 nginx 的命令。
crontab 六个字段含义:
minute: 表示分钟,(整数 0 -59)。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

如果字段使用 * 号,如month字段为 * 号,则为满足其他字段约束的每月都执行该命令。

文章评论

请先 登录 ,才可参与评论!

全部评论( 0 )