去年是用非正常手段签的免费 AlphaSSL 野卡,12月27号就过期。正好今天没事就用 Let’s Encrypt 替换原来的证书。我的博客问题在于部分资源是缓存到又拍云上面的,所以自己的服务器上要签一次证书,又拍云上要签一次。好在又拍云自己可以签发续签 Let’s Encrypt 证书,问题在于只能一个域名签一个证书,而且不支持签发 ECC 证书。

在自己服务器上签发 Let’s Encrypt 证书建议使用 acme.sh 这个工具,支持自动续签。这是它的中文说明
安装acme.sh

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

alias acme.sh=~/.acme.sh/acme.sh

安装的同时脚本会自动为创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。

域名验证有多种方式,我喜欢使用 DNS API 来完成自动验证并签发。我使用的是 DNSPOD ,所以先在 DNSPOD 的安全设置中开启 API Token 生成 API_ID 和 API_KEY。

export DP_Id="1234"

export DP_Key="sADDsdasdgdsf"

acme.sh --issue --dns dns_dp -d isthnew.com -d www.isthnew.com -d status.isthnew.com -k ec-256

-k ec-256是指定生成 ECC 证书,如果需要签发 RSA 证书请去掉。这时候工具会通过 DNS API 添加一条验证记录并自动签发证书。

你可以通过使用

acme.sh  --installcert  -d isthnew.com   \
--key-file   /home/robertyang/crt/isthnew.key \
--fullchain-file /home/robertyang/crt/isthnew.crt \
--reloadcmd  "sudo nginx -s reload"

来导出证书和密钥,同时自动重新加载 Nginx 。

不过我发现我的账户使用 sudo 命令的时候会要求输入密码,这就不太OK了。先切换到 root 用户下,然后使用 visudo 命令将我的用户配置改为

username ALL=(ALL) NOPASSWD: ALL

搞定!