HTTP 报文以明文形式传输,如果你的网站只支持 HTTP 协议,那么就有可能遭受到安全攻击。你可以使用 Google 浏览器打开一个 HTTP 协议网站,会发现 Chrome 在网址的左边将这个网站标记为不安全。
HTTPS 为 HTTP 报文提供了一个加密传输的通道,这样攻击者就无法窃听或者篡改传输的内容。要启用 HTTPS,必须向一个可信任机构申请一个 HTTPS 证书。专业的证书申请需要收费,不过对于个人博客网站来说,有很多免费的证书申请机构。比如 Let’s Encrypt,它提供了免费的证书申请服务,申请过程十分简单,只需要运行几条命令即可,而且证书到期后支持自动续期,可谓一劳永逸。接下来我们就是用 Let’s Encrypt 提供的工具来申请免费的 https 证书。
首先安装 Let’s Encrypt 提供的证书申请工具。登录 https://certbot.eff.org/,选择我们博客网站使用的服务器软件和操作系统。教程中以 Nginx 和 CentOS 7 为例:
首先安装必要工具:
$ sudo yum -y install yum-utils
$ sudo sudo yum install -y certbot python2-certbot-nginx
certbot python2-certbot-nginx 是 Let’s Encrypt 提供的 HTTPS 证书申请的工具,python2-certbot-nginx 是专门针对 Nginx 的插件,使得 Nginx 运行的服务申请证书更加简单方便。
然后运行证书申请命令:
$ sudo certbot --nginx
注意
经测试,运行上述命令后有可能报 ImportError: No module named 'requests.packages.urllib3' 的错误,这是由于 requests 和 urlib3 版本过低所致(可以参考这个 issue 的讨论),解决办法是重装它们,运行下面的命令:
$ pip uninstall requests $ pip uninstall urllib3 $ yum remove python-urllib3 $ yum remove python-requests
然后重新安装 certbot,由于它依赖上面两个包,所以重装时会一并装上:
bash $ sudo yum install -y certbot python2-certbot-nginx
重新执行证书申请命令:sudo certbot --nginx
会有一系列交互式的提示,首先会让你输入邮箱,用于订阅。然后输入 a 同意他们的政策。
接着 certbot 会自动扫描出来域名,根据提示输入想开启 HTTPS 的域名标号:
Which names would you like to activate HTTPS for?
1: django-blog-tutorial-v2-demo.zmrenwu.com
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
然后 certbot 会做一个域名校验,证明你对这个域名有控制权限。验证通过后,Let's Encrypt 就会把证书颁发给你。
最后会提示你是否把 HTTP 重定向到 HTTPS,当然选择是,这样 certbot 会自动帮我们修改 Nginx 的配置,将 HTTP 重定向到 HTTPS,如果用户使用 HTTP 协议访问我们的博客网站,就会重定向到 HTTPS 协议访问,确保安全性。
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/django-blog-tutorial-v2.conf
certbot 申请的证书只有 3 个月有效期,不过没有关系,certbot 可以无限续期,我们增加一条 crontab 定时任务用来执行 certbot 自动续期任务,这样一次申请,终生使用。
打开 /etc/crontab,增加定时任务:
echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew" | sudo tee -a /etc/crontab > /dev/null
这里配置每天 12 点执行自动续期命令。
由于全站开启了 HTTPS,因此需要把网站中非 HTTPS 的内容(比如通过 HTTP 协议请求的外部资源)改为 HTTPS,我们的博客中目前有一处引入外部图标库的样式文件是以 HTTP 协议引入的,需要改为 HTTPS:
base.html
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
以上,简单几步,就开启了全站 HTTPS。
-- EOF --
这是不是我自己还得搞个域名?
是的,如果申请 https 的话,不申请不用。
执行
certbot --nginx
的时候,没有扫描到域名,我输入了一个域名。后面就提示了下面的错误,博主帮忙看看啊,多谢了!UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 2: ordinal not in range(128)
编码错误,检查一下文件编码,Nginx 配置文件最好不要包含中文注释。
不知道有没有因为部署烦心的小伙伴
我推荐使用heroku,如果仅仅是以学习Django开发为主要目的,基本上3分钟就搞定了gunicorn+whitenoise+heroku
我自己的例子:https://yaozeliang.herokuapp.com/
不知道有没有因为部署烦心的小伙伴
我推荐使用heroku,如果仅仅是以学习Django开发为主要目的,基本上3分钟就搞定了gunicorn+whitenoise+heroku
我自己的例子:https://yaozeliang.herokuapp.com/
这个证书有办法撤销吗?配置之后整个nginx服务都不能访问了,nginx重装了都不行
可以执行 docker rm nginx,删除 nginx 容器,然后重新构建 nginx 的容器就可以了。
谢谢博主教程!
但是在部署完之后,网站升级到https了,但是因为请求后台数据的接口还是http的,所以谷歌还是会显示不安全警告.然后我改为https去请求,却超时失败.请问是不是需要django项目也要做相关配置以升级为https的接口?谢谢
问题已解决,是我的失误-
谢谢博主!期待更多优秀的教程!
兄弟,你怎么解决的,现在我也遇到访问超时的问题了。
感谢博主的教程
期待更新后面的 vue.js还有 Docker教程
感谢!!!
期待一个通过自定义后台来操作业务功能的教程
操作什么业务呢?
比如这个博客系统,不用自带的admin,自定义后台,操作所有前台数据
那就自己开发,和教程中讲的类似呀。写视图函数处理请求,渲染模板,返回响应。