为什么要HTTPS
2018年2月8日,谷歌浏览器发布官方博客称,2018年7月发布的新版谷歌浏览器Chrome将把所有的HTTP网站标记为不安全。这项举措是为了促进网络安全,倡导更多网站使用HTTPS加密协议。
HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure,也就是HTTP的安全升级版。HTTPS相较于HTTP,其实就是在HTTP跟TCP中间加多了一层加密层TLS/SSL。
在TSL/SSL证书机制启动的时候,当客户发送任意信息到服务器,浏览器首先根据公钥信息将内容加密后提供给服务器,然后服务器使用私钥解密数据,达到双方安全通信的目的。这样当攻击者即使篡改数据,如果没有私钥,根本无法解密和理解传输的内容。
Let’s Encrpyt是什么
Let’s Encrypt是一套新型证书管理器(简称CA),能够轻松帮助用户获取并安装免费TLS/SSL证书,并借此在Web服务器上实现HTTPS加密。官方网址:https://letsencrypt.org/
Django网站安装Let’s Encrypt SSL证书
我的网站www.zyypost.com是基于Django编写,部署在Apache和mod_wsgi下,经过一段时间的观察和了解,决定为网站安装Let’s Encrypt免费SSL证书。
先说一下环境
Ubuntu 16.04 LTS
Django 1.10.6
Apache 2.4.6
Python 3.5.1
1. 安装git,如果已经安装则忽略
$ sudo apt-get install git
2. clone letsencrpyt
$ cd /usr/local
$ sudo git clone https://github.com/letsencrypt/letsencrypt
3. 生成cert
$ cd /usr/local/letsencrypt
$ sudo ./letsencrypt-auto --apache -d example.com -d www.example.com
生成证书会有两个选项,第一个填A,第二个填N
-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A
-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: N
证书生成后存在live文件夹中,一下四个.pem存在,说明创建成功。
/etc/letsencrypt/live/zyypost.com# ls
cert.pem chain.pem fullchain.pem privkey.pem README
4. 配置apache启动SLL
Ubuntu下启用SSL模块非常简单
$ sudo a2enmod ssl
$ sudo a2ensite default-ssl.conf
$ sudo service apache2 restart
启动成功后,在:/etc/apache2/mods-enabled#中可以查看到ssl.conf配置文件,同时在/etc/apache2/ports.conf中配置监听443端口。
5. Apache SSL配置文件default-ssl.conf
ServerName www.zyypost.com
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/hoge.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/hoge.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/hoge.com/chain.pem
SSLOptions +StdEnvVars
SSLOptions +StdEnvVars
#####其余内容略,和普通的DjangoApache配置一样
6. http重定向配置文件
ServerName www.zyypost.com
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.zyypost.com%{REQUEST_URI} [R=301,L]
7. apache打开rewrite
使上述的重定向生效,需要启动apache的rewrite模块。
$ sudo a2enmod rewrite
8. 打开443端口
这里使用的UFW防火墙,所以需要打开443端口
ufw allow 443
重启Aapche服务器
$ sudo service apache2 restart
如果您按照以上步骤耐心的配置到这里,打开您的网站试试,应该可以看到https前面的小锁标志。说明配置成功了!
9. 配置Let’s Encrypt自动更新
Let’s Encrypt免费证书有效期只有三个月,需要到期前手动更新,当然不用这么麻烦。这里写了一个脚本certbot-auto-renew.sh,脚本每天执行一次自动更新,如果证书更新成功后重启apache服务器。每执行完脚本,将日志写入renew.log
cd /usr/local/letsencrypt
sudo ./certbot-auto renew --renew-hook 'service apache2 restart' >> /var/log/letsencrypt/renew.log
exit 0
每天5:18分更新,避开10,30分整数时间以免服务器拥堵。
vi /etc/crontab
# m h dom mon dow user command
18 5 * * * root /bin/certbot-auto-renew.sh
后记
第2步、第3步安装是根据网上教程摸索而来,在安装完成后,又看到一种不用安装git生成cert的方案,感觉更简单直接,也摘录到一起供大家参考吧。
安装
sudo apt-get install python-letsencrypt-apache
生成证书
sudo letsencrypt --apache certonly -d example.com -d www.example.com
参考
How to secure your Apache using Certbot SSL:https://hostpresto.com/community/tutorials/how-to-secure-your-apache-using-certbot-ssl/
Djangoで開発したWebアプリケーションをLet’s EncryptでSSL対応する(Apache編):https://gyobot.com/blog/detail/7/
Setting up SSL on a Django App with Let’s Encrypt - Ubuntu, Apache, and mod_wsgi:https://www.subevolvere.com/blog/items/4/setting-ssl-django-app-lets-encrypt-ubuntu-apache-and-mod_wsgi