使用Let's Encrypt自动生成HTTPS证书

Let’s Encrypt是什么

Let’s Encrypt是一个免费、开放、可自动化部署的证书签发服务,申请该证书完全免费,只需要验证域名的所有权。一开始我并不打算了解这个服务,但后来发现它能够支持ECC证书。继而有了研究的兴趣,过程中遇到了许多困难,但最终还是搞定了,总结出一些简单粗暴的方法。
同RSA(Ron Rivest,Adi Shamir,Len Adleman三位天才的名字)一样,ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)也属于公开密钥算法。
ECC算法与RSA算法最大的不同就是,ECC的密钥长度远比RSA短。256位的ECC密钥长度,却是2048位RSA密钥长度的十二分之一,也能实现与RSA同等的加密强度,且ECC算法加解密速度更快,存储空间占用更小,带宽要求更低,更适用于移动互联网环境。本网站使用了长度为384位ECC密钥,这是目前LE服务支持的最高级别的ECC证书了。本文参考了GitHub上的文档。

安装le.sh

1
2
curl https://get.acme.sh | sh
alias acme.sh=~/.acme.sh/acme.sh

安装完成之后,这些脚本会在~/.acme.sh/目录下,用于执行命令的脚本是~/.acme.sh/acme.sh

签发证书

1
acme.sh issue /data/hexo/public/ yatesun.com www.yatesun.com,blog.yatesun.com ec-384 && cd /root/.acme.sh/ &&cat yatesun.com/yatesun.com.cer yatesun.com/yatesun.com.csr yatesun.com/ca.cer >yatesun.com/yatesun.com.crt && lnmp nginx reload

通过该命令,可以签发得到包含100个域名在内的HTTPS证书,需通过cat将三个不同的文件合并之后,nginx才可以直接使用。

nginx配置

加入如下命令,因为Let’s Encrypt需要指定根目录,它会加入一些验证文件到.well-known/acme-challenge/目录,也选择其他方式让该路径可访问。

1
2
3
location ~ /\.well-known
{
}

配置自动部署

/etc/crontab中加入如下脚本:

1
0 0 1 * * root acme.sh issue /data/hexo/public/ yatesun.com www.yatesun.com,blog.yatesun.com ec-384 && cd /root/.acme.sh/ &&cat yatesun.com/yatesun.com.cer yatesun.com/yatesun.com.csr yatesun.com/ca.cer >yatesun.com/yatesun.com.crt && lnmp nginx reload

至此,HTTPS证书将会在每个月1号自动更新,另外写一个脚本重启一下nginx即可。