为什么需要HTTPS
现在互联网全网HTTPS是大势所趋,各大巨头也在努力推动 HTTPS 的发展。而且如果你没有HTTPS,运营商就可以在用户发起请求时直接跳转到某个广告中,或者直接改变搜索结果插入自家的广告等。不过由于ssl证书一直作为收费项目,也导致HTTPS很难推广,不过现在现在Mozilla、思科、Akamai、IdenTrust、EFF 和密歇根大学的大佬们宣布了 Let’s Encrypt CA项目,推出了免费的ssl证书,所以我想上手实践把自己的博客加上https。
顺便推荐鹅厂的一篇有关文章全站 HTTPS 来了
Let’s Encrypt
Let’s Encrypt官网
生成 Let’s Encrypt 证书
我们借助Certbot来生成我们的Let’s Encrypt,先选择适合自己的部署方式,这里以Nginx和Ubuntu16.04 LTS为例子讲解。
安装Cerbot
在服务器端安装Cerbot:
1 | sudo apt-get update |
签发证书
1 | sudo certbot certonly --standalone -d example.com -d www.example.com |
第一次的话,过程中会验证你的邮箱和询问你是否同意协议
解释下certonly
是它的子命令,表示只颁发证书。-d
是指定目录对应的域名。
配置nginx
然后我们在Nginx的server下设置如下响应的ssl选项就行了,如下面这种:
1 | server { |
测试下是否有问题:
1 | sudo nginx -t |
如果没有问题的话就重启下Nginx:
1 | sudo systemctl restart nginx |
大家可以使用Qualys SSL Labs安全测试或Myssl对自己的网站进行检测。
自动更新证书
由于let’s encrypt 证书只有90天的有效期,需要续期
我们可以通过运行以下命令来测试证书的自动续订功能:
要先关闭nginx服务
1 | sudo systemctl stop nginx |
然后输入:
1 | sudo certbot renew --dry-run |
续期的话可以直接使用如下代码:
1 | sudo letsencrypt renew |
然后要开启nginxsudo systemctl start nginx
不过这里我们使用脚本来自动更新
在路径/opt/scripts
下新建文件letsencrypt_renew
,内容如下:
1 | !/bin/sh |
然后用crond
来自动更新证书。用sudo crontab -e
命令编辑root用户的crontab。在最后面添加如下内容:
1 | 0 */12 * * * sh /opt/scripts/letsencrypt_renew |
即每12小时的第0分执行脚本一次。因为Let’s Encrypt的推荐每12小时更新一次。
可能出现的问题
如果遇到了
1 | Problem binding to port 443: Could not bind to IPv4 or IPv6.. Skipping |
这是因为nginx服务没有关闭导致的,这时间可以使用systemctl
来关闭:sudo systemctl stop nginx
或者使用service nginx stop
关闭
参考
Let’s Encrypt 给网站加 HTTPS 完全指南
如何使用Ubuntu 14.04加密Nginx