有歧为贵,不取苟同。
——蔡元培
一个算法攻城狮阴差阳错搞起前后端?看我怎么为Nginx注册免费的TLS证书!
准备工作
- 域名:your.domain (本例中域名挂在 Cloudflare 下)
安装 acme.sh
acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书.
1 | 安装 acme.sh |
安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/
生成 TLS 证书 (CloudflareDNS 验证)
acme.sh 实现了 acme 协议支持的所有验证协议。一般有两种方式验证: HTTP 和 DNS 验证,这里使用 Cloudflare DNS 验证。Cloudflare域API提供了两种自动颁发证书的方法。
使用全局API密钥
登录到Cloudflare帐户以获取API密钥。
1 | export CF_Key="xxxxxxxxxxxxxxxx" |
使用新的 Cloudflare API 令牌(Token)
为了使用新令牌,令牌当前需要跨所有区域对Zone.Zone的访问权限和对Zone.DNS的写权限。或者,如果证书仅涵盖单个区域,则可以仅对单个域对Zone.DNS的写访问限制API令牌,然后CF_Zone_ID直接指定。
1 | export CF_Token="aaaaaaaaaaaaaaaa" |
我们现在可以颁发证书:
1 | acme.sh --issue --dns dns_cf -d your.domain -d www.your.domain |
该CF_Key和CF_Email或CF_Token和CF_Account_ID将被保存~/.acme.sh/account.conf
,需要时会被重用。
安装 TLS 证书
前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方.
注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/
, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.
正确的使用方法是使用 --install-cert
命令,并指定目标位置, 然后证书文件会被copy到相应的位置。
1 | Nginx example: |
(一个小提醒, 这里用的是 service nginx force-reload
, 不是 service nginx reload
, 据测试, reload
并不会重新加载证书, 所以用的 force-reload
)
Nginx 的配置 ssl_certificate
使用 /etc/nginx/ssl/fullchain.cer
,而非 /etc/nginx/ssl/<domain>.cer
,否则 SSL Labs 的测试会报 Chain issues Incomplete
错误。
--install-cert
命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd会被自动调用,让服务器生效.
详细参数请参考: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc
值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用.
更新证书
目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.
TODO
关于 Cloudflare 生成和使用 API 更充实的信息和截图。
Reference
- acmesh-official/acme.sh
- Let’s Encrypt - Free SSL/TLS Certificates
- Cloudflare