Let’s Encrypt SSL证书配置记录

本文参考了以下链接:https://segmentfault.com/a/1190000005797776

  • 下载certbot

官网:https://certbot.eff.org/ 点进去会让你选HTTP Server和OS,然后会出对应的操作流程。

Ubuntu 14.04的话,需要你自己下载certbot-auto脚本:

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
mv certbot-auto /usr/local/bin/

移到/usr/local/bin下,方便在任何地方调用

如果是Ubuntu 16.04,则直接通过apt安装即可:

sudo apt update
sudo apt install letsencrypt
  • certbot的两种工作方式

certbot(实际上是certbot-auto或letsencrypt,下文仅用certbot来代替,拷贝命令后注意记得替换) 有两种方式生成证书:standalonewebroot

standalone方式,certbot会自己起一个http server来进行验证。然而我们自己已经有Nginx或Apache在运行了,用standalone方式需要先关掉我们自己的http server(除非你自己的server没有占用80/443端口),听上去不是个好主意。
webroot方式,certbot会借用既有的http server,在其web root目录下创建隐藏文件,LetsEncrypt服务端会通过域名来访问这些隐藏文件,以确认你的确拥有对应域名的控制权。

好了,下文就以webroot方式为例,来演示如何创建证书以及自动续期。

假设你要创建一个证书,包含以下三个DNS Name:example.com 、 www.example.com 、api.example.com ,根域名和www都指向www网站,api指向api网站。
你的服务器上已经配置好,这三个域名、两个网站已经可以正常通过http访问。

  • 配置Nginx

为你的两个站点:www和api的server模块分别添加以下内容:

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

location = /.well-known/acme-challenge/ {
   return 404;
}

然后重载Nginx:

sudo nginx -s reload
  • 生成证书
sudo certbot certonly --webroot -w /usr/share/nginx/html -d example.com -d www.example.com -d api.example.com

一个-w参数对应后面跟着的一系列-d参数,直到遇到另一个-w参数。
我们这条命令的意思是,让certbot创建证书,包含三个DNS Name,它们各自对应的ACME验证文件都放到/usr/share/nginx/html/下,这个路径必须跟上面Nginx站点配置中我们为acme-challenge设置的web root保持一致。

第一次运行的时候会自动安装一系列依赖包,并且每次验证时它会往-w指明的目录下写入隐藏文件,所以用sudo是比较保险的做法。

运行后,会提示你输入Email地址,还要你同意TOS
如果最后看到提示中有Congratulations啥啥的一坨废话,就说明证书生成OK,有效期为90天。
证书被保存在/etc/letsencrypt/live/example.com/下。需要注意的是live目录下的证书只是软链接,续期后实际的证书文件名可能发生更改,但live下面的软链接名不会改。
所以我们可以放心地在Nginx中使用live这个固定路径。

之后就可以修改Nginx配置以支持https了。证书路径相关配置如下:

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
  • 自动续期

先测试一下续期是否OK:

sudo certbot renew --agree-tos --dry-run

该操作会为所有已创建过的证书进行续期,--agree-tos参数表示静默同意烦人的TOS,--dry-run参数表示只模拟续期,不会替换最终的证书文件。
再次看到Congratulations时,表示续期OK,那接下来我们就可以放到crontab中了。

sudo crontab -e

填入以下内容(for Ubuntu 14.04):

0 3 * * 1 /usr/local/bin/certbot-auto renew --agree-tos >> /var/log/le-renew.log
0 0 * * 2 /usr/sbin/nginx -s reload

或者(for Ubuntu 16.04)

0 3 * * 1 /usr/bin/letsencrypt renew --agree-tos >> /var/log/le-renew.log
0 0 * * 2 /usr/sbin/nginx -s reload

保存退出。

注意到sudo crontab -e我加了sudo,表示修改的是root用户的crontab规则,而非用户自己的crontab。
以上规则表示在每周一的凌晨3点自动续期,log文件存放在 /var/log/le-renew.log中。
然后每周二的零点reload nginx——如果续期成功,证书发生了修改,必须reload nginx才能使新证书生效。

发表评论

电子邮件地址不会被公开。 必填项已用*标注