0%

在Ubuntu和CentOS上获取Let’s Encrypt免费证书 为网站使用https

为什么需要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
2
3
4
5
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx

签发证书

1
sudo certbot certonly --standalone -d example.com -d www.example.com

第一次的话,过程中会验证你的邮箱和询问你是否同意协议
解释下certonly是它的子命令,表示只颁发证书。-d是指定目录对应的域名。

配置nginx

然后我们在Nginx的server下设置如下响应的ssl选项就行了,如下面这种:

/etc/nginx/conf.d/www.example.com.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 443 ssl;
server_name example.com www.example.com;

root /var/www/hexo;
index index.html index.htm;

ssl on;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

location / {
try_files $uri $uri/ =404;
}
}

测试下是否有问题:

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,内容如下:

/opt/scripts/letsencrypt_renew
1
2
3
4
#!/bin/sh
systemctl stop nginx
letsencrypt renew
systemctl start nginx

然后用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