Let's Encrypt 免费的通配符域名证书

免费 SSL 证书提供商 Let's Encrypt 去年承诺的 ACME v2 以及通配符证书(Wildcard Certificate)终于在 3 月 14 日正式发布了。ACME 全称“自动化证书管理环境”,用于自动验证域名所有权并颁发 SSL 证书;本次发布的新版 ACME v2 添加了通配符证书的支持,再也不用每次添加子域名都重新申请证书。

ACME v2 目前只有一种方案支持通配符证书的验证—— DNS-01 challenge,即:通过向域名添加一条 TXT 记录来证明用户对域名的所有权。一般只要提供了 Token 访问的 DNS 服务商都可以支持,例如 GoDaddy、CloudFlare、DNSPod 等。

截至目前为止,官方推荐的 ACME 客户端 Certbot 还没有支持 ACME v2,这里推荐另一个小巧的客户端 acme.sh,它完全用 shell 脚本构成,快速安装方法如下:

1
curl https://get.acme.sh | sh

为了使用 DNS-01 challenge,先在 DNS 服务商那里启用 Token 访问。这里以 DNSPod 为例,其它服务商参见完整支持列表

然后运行:

1
2
3
export DP_Id="49644"
export DP_Key="******************************"
acme.sh --issue --dns dns_dp -d example.com -d *.example.com

如果一切顺利,可以看到证书已经生成了。如果要安装到 nginx 中,还需要转换成 PEM 格式:

1
2
3
acme.sh --install-cert -d example.com -d *.example.com \
--key-file /etc/nginx/certificates/example.com/key.pem \
--fullchain-file /etc/nginx/certificates/example.com/cert.pem

最后把 nginx 配置从 HTTP 修改成 HTTPS:

1
2
3
4
5
6
7
8
9
server {
listen 443 ssl;
server_name www.example.com example.com;

ssl_certificate /etc/nginx/certificates/example.com/cert.pem;
ssl_certificate_key /etc/nginx/certificates/example.com/key.pem;

# other configurations ...
}

重启 nginx,大功告成。