免费的Let’s Encrypt证书

一个比较离谱的事情发生了,我每年在阿里云搞得免费证书现在有效期只有3个月,相当于我TM每三个月就要去手动更新一下证书,之前的博客也写了SSL这个东西简直就是一本万利的事情(局域网内搭建浏览器可信任的SSL证书),这种完全不能忍,所以拜拜了资本家,老子不用你了,免费证书不香吗?

Let’s Encrypt就是免费证书的代表,这玩意几乎所有设备都支持,并且能申请通配证书,步骤如下:

安装snapd,这是为了安装certbot的工具

yum install snapd

systemctl enable --now snapd.socket

ln -s /var/lib/snapd/snap /snap

安装certbot,这个工具就是拿来申请证书的

snap install --classic certbot

ln -s /snap/bin/certbot /usr/bin/certbot

申请证书

certbot certonly --manual --preferred-challenges dns
  1. 在运行这个命令之后会开始证书的申请步骤,具体如下:
  2. 如果需要提供邮箱就按照提示输入邮箱即可;
  3. 按照提示输出域名,用空格分隔多个域名
    1. 注意:tangyuecan.com和www.tangyuecan.com是两个不同的域名,如果使用通配域名就是*.tangyuecan.com
  4. 通过提示进行DNS验证,这里按照要求添加一个TXT解析即可
    1. 注意:连续超过5次解析失败,服务器在未来五个小时都无法继续申请
  5. 成功之后就会生成对应的证书文件;

使用证书

certbot 生成的证书文件很多,其中对于nginx等常规的web server就只有两个有用:

  • fullchain.pem:这个是证书文件,兼容大部分web server;
  • privkey.pem:这个是秘钥文件;

以nginx为例,最终使用证书配置如下:

server {
    listen       443 ssl http2 default_server;
    listen  [::]:443 ssl http2 default_server;

    server_name tangyuecan.com;
    ssl_certificate /ssl/fullchain.pem;
    ssl_certificate_key /ssl/privkey.pem;

    root   /var/www/html;
    index index.php;

    location / {
	try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
	include fastcgi.conf;
	fastcgi_intercept_errors on;
	fastcgi_pass xxx.xxx.xxx.xxx:xxxx;
    }
}

自动更新证书

没有想到吧,还有这个功能,原理也很简单,但是使用上存在一个问题,每一次更新的证书的时候都需要对域名所有权进行一次校验,只有通过了校验Let’s Encrypt才会知道这个域名是你在管理,进而才会为你更新证书,上文使用DNS进行验证的话,运行renew进行重新校验可能是没法通过的,因为certbot无法访问你的DNS解析对吧,所以这里最佳方案是通过web服务器进行验证。

certbot certonly --webroot -w /var/www/example -d www.example.com -d example.com --dry-run
# 其中--dry-run的意思是测试,正式更新的时候去掉就行了;-w指的是webroot的路径,对应-d就是该路径下的域名,明显一个路径下有多个域名

特别注意:如果你使用了泛域名解析就不能直接通过webroot进行更新证书,毕竟泛域名不大可能指向同一个webroot路径,这种情况下想要实现自动更新证书只有通过DNS插件才能实现,可以参考这个项目

留下回复