django https 的坑

记录下这个大坑

以往我的https都是歪门邪道,我用着nginx的ssl证书,然后用django-sslserver直接引用nginx的证书,最后再用nginx监听80端口做重定向给django-sslserver的443。

这么做看似没有问题,但是socket总是报莫名其妙的错误,而且runsslserver毕竟也算是开发环境,生产环境中这样用也是不合适的。所以今天用上了正规的nginx+uwsgi+https,但是呢sad道阻且长,下面简单记录下步骤吧,防止自己遗忘。

首先ssl证书的获取:

预先工作

在创建证书之前,我们需要确保 Web 服务器可以在根目录下的该路径下提供静态文件:/.well-know。由于django 应用程序引入的所有路径都通过 wsgi 提供服务,因此我们需要编写nginx 配置以便于静态地提供这些资源:将以下内容添加到域名的 nginx 配置文件中:

 

server {
    location /.well-known/acme-challenge {
        alias /path/to/yoursite/.well-known/acme-challenge;
    }
}

请根据自己的情况修改 /path/to/yoursite/字段,比如 改成/home/User/aifuture.site ,这个路径便是 Django app 的绝对路径,即 manage.py 文件所在目录。

下载Certbot

从 github 上面下载源码,可以不用管 Linux 服务器发行版的区别:

 

git clone https://github.com/certbot/certbot.git

生成证书

因为我们是 nginx 而不是 Apache,所以使用 webroot选项获取证书:

 

certbot certonly --webroot -d aifuture.site -d www.aifuture.site

请修改 /path/to/yoursite字段,和上面预先工作的修改一样,然后后面的aifuture.site 和 www.aifuture.site 请修改成自己的域名,如果现在的域名不能加 www 访问的话(即没有提供 WWW 的解析),请去掉最后这条字段。

这条命令成功的输出类似于这样(有Congratulations):

Output:
IMPORTANT NOTES:

  • If you lose your account credentials, you can recover through
    e-mails sent to sammy@digitalocean.com

  • Congratulations! Your certificate and chain have been saved at
    /etc/letsencrypt/live/example.com/fullchain.pem. Your
    cert will expire on 2018-08-31. To obtain a new version of the
    certificate in the future, simply run Let's Encrypt again.

  • Your account credentials have been saved in your Let's Encrypt
    configuration directory at /etc/letsencrypt. You should make a
    secure backup of this folder now. This configuration directory will
    also contain certificates and private keys obtained by Let's
    Encrypt so making regular backups of this folder is ideal.

  • If like Let's Encrypt, please consider supporting our work by:

    Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
    Donating to EFF: https://eff.org/donate-le

上述命令会为aifuture.site和www.aifuture.site生成一个单独的证书。证书存储于 /etc/letsencrypt/live/aifuture.site/fullchain.pem.

Django配置

参考官方链接:

https://docs.djangoproject.com/en/1.10/topics/security/#ssl-https

修改配置文件setting.py,将以下行加入进去:

 

SESSION_COOKIE_SECURE=True
SESSION_COOKIE_HTTPONLY=True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')

Let’s Encrypt 自动续期

Let’s Encrypt 的证书90天就过期了,所以,我们还需要设置自动化更新脚本,最容易的莫过于使用 crontab 了。使用 crontab -e 命令加入如下的定时作业(每周都强制更新一下,如果需要 root 权限,需要切换到 root 下执行):

 

45 2 * * 2 cd /etc/letsencrypt/ && ./certbot-auto renew --deploy-hook "service nginx reload"

crontab 六个字段含义:

minute hour day month week command

其中:

  • minute: 表示分钟,(整数 0 -59)。
  • hour:表示小时,可以是从0到23之间的任何整数。
  • day:表示日期,可以是从1到31之间的任何整数。
  • month:表示月份,可以是从1到12之间的任何整数。
  • week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
  • command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

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

这里是每周 2 的 2 点 45 分尝试更新证书,如果证书在 30 天内到期,则会更新证书,否则不会更新, --deploy-hook选项表示在更新成功以后才运行重载 nginx 的命令。

证书搞定了,那么如何使用呢?

django的开发就不讲了,下面从uwsgi开始,在manage.py同级目录下创建一个uwsgi的ini文件,名字可以随意,但是路径不能随意,不然又是莫名其妙的import错误,前端反映的就全都是nginx的404。ini文件内容:

[uwsgi]

socket=:随意一个端口,如(1234)
module=web.wsgi
master=True
processes=2
vacuum=true
daemonize=wsgi.log

然后命令行:

uwsgi --ini uwsgi.ini 

这就算是服务启动了,下面还要建立和nginx之间的scoket管道,nginx的default server配置如下:


server{
     listen 80;
     rewrite ^(.*)$ https://www.aifuture.site$1;
}
server{
    listen 443;
    server_name www.aifuture.site;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/www.aifuture.site/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.aifuture.site/privkey.pem;
    ssl_session_timeout 3m;
    location /templates/{
	alias /root/文档/1/web_app/templates;
    }

    location /static {
	alias /root/文档/1/web_app/static;
    }
    location /media {
	alias /root/文档/1/web_app/media;
    }
    location  /{
	uwsgi_pass uwsgi地址,如(127.0.0.1:1234);
        include /etc/nginx/uwsgi_params;
    }

   

}

内容就不翻译了,里面就是配置了http转https,然后ssl证书路径,然后static,media,templates路径,然后其他的请求转交给uwsgi的地址.

然后还有一个坑,要把nginx.conf里的user 换成root,不然有可能访问权限不够。全给你一堆403错误

还没完呢,还有一个坑,admin界面的静态文件,要收集一下,参见这篇博客

https://blog.csdn.net/qq_42571805/article/details/80862455

搞完这些,就算是正规部署了broken heart太累了,坑真多

期望这下我不会再遇到django-sslserver那些莫名其妙的坑了


        留下评论吧,AnonymousUser

              没有登录的话是不能使用评论功能的哈。 去登录 去注册


评论列表
暂无评论