申请泛域名证书

Let's Encrypt 已经支持泛域名证书了,由于 acme.sh 实现了 acme 协议,可以从 Let's Encrypt 生成免费的证书,并且支持自动更新,所以这里使用它来快速实践一下。

安装 acme.sh

首先安装 acme.sh,可以使用官方提供的自动安装脚本,默认会把 acme.sh 安装到用户目录下,同时创建 cron 每日任务去检查是否有证书需要更新。

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

获取域名 API

目前泛域名证书仅支持 DNS 验证,acme.sh 通过 DNS 提供商的 API 自动完成域名验证、添加删除记录等操作,因此我们需要先设置 DNS API。我使用的是腾讯云提供的云解析,腾讯云使用的是 DNSPOD 的服务,这两家账号是通用的,登录后如果没有 API Token 则创建一个。

API Token

生成证书

拿到 Token 后,将对应的 id 和 token 设置为环境变量。

1
2
$ export DP_Id="你的 Id"
$ export DP_Key="你的 Token"

接下来使用命令申请证书。dns 参数的值与使用的 DNS 脚本有关,具体可以参见 acme.sh说明文档

1
$ ./acme.sh --issue --dns dns_dp -d nekolr.com -d *.nekolr.com --keylength ec-256

证书有两种,一种是 ECC 证书(内置公钥是 ECDSA 公钥),一种是 RSA 证书(内置 RSA 公钥)。简单来说,同等长度 ECC 比 RSA 更安全,在具有同样安全性的情况下,ECC 的密钥长度比 RSA 短得多(加密解密会更快)。但是 ECC 的兼容性会差一些,不支持 Android 4.x 以下的版本,也不支持 Windows XP。

添加证书

生成证书以后,使用命令将证书拷贝一份留作备用(尽量避免手动拷贝,容易出错)。

1
2
3
4
5
6
$ ./acme.sh --installcert -d nekolr.com -d *.nekolr.com \
--fullchain-file /etc/letsencrypt/live/nekolr.com/fullchain.pem \
--key-file /etc/letsencrypt/live/nekolr.com/privkey.pem \
--ca-file /etc/letsencrypt/live/nekolr.com/chain.pem \
--cert-file /etc/letsencrypt/live/nekolr.com/cert.pem \
--reloadcmd "nginx -s reload" --ecc

接下来修改 nginx 的配置文件,添加证书。

1
2
3
4
5
6
7
8
9
# SSL 证书
ssl_certificate /etc/letsencrypt/live/nekolr.com/fullchain.pem;
# SSL 私钥
ssl_certificate_key /etc/letsencrypt/live/nekolr.com/privkey.pem;
# CA 根证书
ssl_trusted_certificate /etc/letsencrypt/live/nekolr.com/chain.pem;
# 加密套件
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;

自动更新证书

为了实现自动更新证书,需要添加 renew-hook 参数。

1
2
3
4
5
6
7
$ ./acme.sh --issue --dns dns_dp -d nekolr.com -d *.nekolr.com --keylength ec-256 \
--renew-hook "acme.sh --installcert -d nekolr.com -d *.nekolr.com --ecc \
--fullchain-file /etc/letsencrypt/live/nekolr.com/fullchain.pem \
--key-file /etc/letsencrypt/live/nekolr.com/privkey.pem \
--ca-file /etc/letsencrypt/live/nekolr.com/chain.pem \
--cert-file /etc/letsencrypt/live/nekolr.com/cert.pem \
--reloadcmd \"nginx -s reload\""