Let’s Encrypt

Let’s Encrypt 简介

如果要启用HTTPS,我们就需要从证书授权机构(以下简称CA) 处获取一个证书,Let’s Encrypt 就是一个 CA。我们可以从 Let’s Encrypt 获得网站域名的免费的证书。这篇文章也主要讲的是通过 Let’s Encrypt + Nginx 来让网站升级到HTTPS。

Certbot 简介

Certbot 是Let’s Encrypt官方推荐的获取证书的客户端,可以帮我们获取免费的Let’s Encrypt 证书。Certbot 是支持所有 Unix 内核的操作系统的,个人博客的服务器系统是CentOS 7,这篇教程也是通过在个人博客上启用HTTPS的基础上完成的。

获取免费证书

安装Certbot客户端

yum install certbot

配置nginx

location ^~ /.well-known/acme-challenge/ {
   default_type "text/plain";
   root     /usr/local/nginx/html;
}
location = /.well-known/acme-challenge/ {
   return 404;
}

上面配置目的: 下一步获取证书时,certbot 会通过访问 example.com/.well-known/acme-challenge 来验证你的域名是否绑定的这个服务器

获取证书

sudo certbot certonly --webroot -w /usr/local/nginx/html/ -d yourdomain.com -d www.yourdomain.com

这个命令会为 yourdomain.com 和 www.yourdomain.com 这两个域名生成一个证书,使用 --webroot 模式会在 /usr/local/nginx/html/ 中创建 .well-known 文件夹,这个文件夹里面包含了一些验证文件,certbot 会通过访问 yourdomain.com/.well-known/acme-challenge 来验证你的域名是否绑定的这个服务器

image.png

自动更新 SSL 证书

配置完这些过后,我们的工作还没有完成。 Let’s Encrypt 提供的证书只有90天的有效期,我们必须在证书到期之前,重新获取这些证书,certbot 给我们提供了一个很方便的命令,那就是 certbot renew。 通过这个命令,他会自动检查系统内的证书,并且自动更新这些证书。 我们可以运行这个命令测试一下

certbot renew --dry-run

我在运行的时候出现了这个错误

Attempting to renew cert from /etc/letsencrypt/renewal/api.diamondfsd.com.conf produced an unexpected error: At least one of the required ports is already taken.. Skipping.

[图片上传失败...(image-d98ef6-1561642570043)]

这是因为我的api.diamondfsd.com生成证书的时候使用的是 --standalone 模式,验证域名的时候,需要启用443端口,这个错误的意思就是要启用的端口已经被占用了。 这时候我必须把nginx先关掉,才可以成功。果然,我先运行 service nginx stop 运行这个命令,就没有报错了,所有的证书都刷新成功

证书是90天才过期,我们只需要在过期之前执行更新操作就可以了。 这件事情就可以直接交给定时任务来完成。linux 系统上有 cron 可以来搞定这件事情。 我新建了一个文件 certbot-auto-renew-cron, 这个是一个 cron 计划,这段内容的意思就是 每隔 两个月的 凌晨 2:15 执行 更新操作。

15 2 * */2 * certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"
--pre-hook 这个参数表示执行更新操作之前要做的事情,因为我有 --standalone 模式的证书,所以需要 停止 nginx 服务,解除端口占用。 --post-hook 这个参数表示执行更新操作完成后要做的事情,这里就恢复 nginx 服务的启用

最后我们用 crontab 来启动这个定时任务

crontab certbot-auto-renew-cron

查询证书信息

certbot certificates

编辑定时器

crontab -e

添加定时脚本

# 每月1号执行更新证书
*/1 * * * * certbot renew --pre-hook killall nginx --post-hook /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

至此,整个网站升级到HTTPS就完成了

你可能感兴趣的:(Let’s Encrypt)