在申请Let's Encrypt证书时可能会遇到的坑

在申请Let's Encrypt证书时可能会遇到的坑

最近尝试给我的博客申请一个Let’s Encrypt证书, 结果发现跟网上的各种教程有点不同, 不是简单的clone一个repo那么简单 — 坑真的很多.

首先还是先把repo给clone下来再说. Let’s Encrypt 的官方repo里有一个现成的签署证书(?)用的工具.

1
2
3
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto certonly --standalone --email <youremail> -d <yourdomain> -d <www.yourdomain># email和域名换成你自己的

这样下来最后的输出出现了”Important Notes”之类的, 好像成功了诶! cd至/etc/letsencrypt 才发现下面空荡荡的什么都没有. google了一番才发现是因为 nginx 占用了 port 80. 解决方法就是先 systemctl stop nginx.

再做一遍. 这个时候就好玩了; 出现了 Challenge failed for domain, 看了下错误说明好像是dns问题. 十几分钟google之后我突然找到了答案: 我当时在freenom上注册域名时没有加www.<yourdomain>的记录, 也就没有经过freenom的dns解析, 自然找不到这个域名. 我就把上面的命令改成了

1
./letsencrypt-auto certonly --standalone --email <youremail> -d <yourdomain> #同上

我就想反正www.的问题可以慢慢解决, 先把证书搞到手再说. 这次成功了……

cd至/etc/letsencrypt/live看, 下面该有的四个.pem也终于有了.

你以为这就完了? 没有, 还要配置nginx呢…

vim /etc/nginx/nginx.conf. 然后在注释”SSL settings” (如果你的nginx.conf是套模板的话) 的那里写两行:

1
2
ssl_certificate /etc/letsencrypt/live/<yourdomain>/fullchain.pem; # 域名换成你自己的
ssl_certificate_key /etc/letsencrypt/live/<yourdomain>/privkey.pem; #同上

再在 /etc/nginx/sites-available/<你的站点配置文件名> 那里, server{ 下面加两句:

1
2
listen 443 ssl;
listen [::]:443 ssl;

看到那里已经有写 listen 80 了? 不要紧, 先删掉就行(当然一会儿会以船新的方式加回来). 这个时候就可以尝试 systemctl start nginx 了.

进网站看了一下, 发现网址旁边竟然没加锁…… 试了一下 https 才终于看到加了锁. 这就说明我们要设置 http 重定向至 https. (据说对于一些没有备案导致80端口被cngov封的网站也有帮助)

还是在上面那个站点配置文件里, 新加 一个 server{} 段, 在那里面写上:

1
2
3
listen 80;
server_name <yourdomain>; # 同上
rewrite ^(.*) https://$host$1 permanent;

systemctl restart nginx 一下, 这次不管怎么输入网址都是加锁的了.

不过要注意的是这个证书默认会在90天后过期, 所以还是要定期renew. 因为我们肯定会忘可以把这条命令写进crontab里省事一点:

1
./letsencrypt-auto renew --pre-hook "service nginx stop" --post-hook "service nginx start" #同上

小结

总之要注意的坑就这么几个:

  1. 做这些操作前先 systemctl stop nginx
  2. 前面带www.的域名也要在你注册域名的那个地方添加一个dns记录
  3. 做好 http https 重定向 的工作
  4. 证书默认会在90天后过期, 这个时候crontab就派上用场了

#EOF.