一、前言
本文使用acme.sh达成ssl证书的自动化申请、部署。acme.sh是纯shell script,兼容性极强,涵盖各类桌面linux发行版、windows、macos,甚至是嵌入式系统,如OpenWrt,Asuswrt,群晖的Synology Diskstation等等。支持的CA也从最早的只有Let’s Encrypt,扩展增加了ZeroSSL等数家,并且兼容 RFC8555-compliant CA。并且自动化部署也非常方便,文档也非常完善,从nginx、apache的自动部署,到openwrt、synology nas的自动部署都有文档教程。官方的wiki非常全面,本文仅仅是对一个简单流程的快速介绍,方便新用户快速入门。详细的细节还请参考官方wiki。
二、安装
默认安装至 /root/.acme.sh 中,使用curl或者wget可快速安装:
curl:
1 |
curl https://get.acme.sh | sh -s email=my@example.com |
wget:
1 |
wget -O - https://get.acme.sh | sh -s email=my@example.com |
其中email=my@example.com输入自己的邮箱,作为向CA申请证书时候的用户标识。
细节参见:https://github.com/acmesh-official/acme.sh/wiki/How-to-install
接下来将默认使用的CA改为Let’s Encrypt:
1 2 |
cd ~/.acme.sh ./acme.sh --set-default-ca --server letsencrypt |
支持的CA列表详见:https://github.com/acmesh-official/acme.sh/wiki/Server
三、域名验证方式
向CA申请证书需要验证域名。主要有两种方式,一种是acme challenge,另一种是DNS验证。
acme-challenge需要在申请域名的特定目录下放一个特定的网页文件,来验证你是整个域名的所有者。而DNS验证就是向申请域名添加一个特定的TXT记录来验证。
DNS验证相对灵活,可以直接申请该域名下的各种子域名。但需要有该域名的DNS管理权限。而且如果想要实现自动化流程,DNS服务提供着需要提供相应的DNS 管理API来允许自动化工具增删TXT记录。acme.sh安装目录下的dnsapi目录中存储了很多dns api脚本,支持很多家的DNS自动化验证,如cloudflare, dnspod等等,非常多。如果你使用DNS服务商受acme.sh支持,则非常推荐使用该方式申请证书。
相对的,acme-challenge验证就相对不那么自由,需要在申请域名下运行一个web server来验证。acme.sh有两种方式实现。一种是webroot模式,适合于当前主机已经运行了一个现有的web server,acme.sh只需指定站点web root的位置,acme.sh会在申请证书是自动向站点内放入相应的文件用于验证,并在验证完成后移除。。另一种则是standalone模式,适合于当前主机没有运行web server的情况,acme.sh会拉起一个独立的web server(需要安装socat)用于验证。
四、使用DNS API申请证书
使用DNS API来验证域名并申请证书时,需要配置DNS服务商的API认证码。以DNSimple为例。
在DNSimple的账户设置中,xxx中选择生成一个token,拷贝这个token,假如是”sdfsdfsdfljlbjkljlkjsdfoiwje”,申请证书步骤如下(加上–ecc命令可申请ecc证书):
1 2 |
export DNSimple_OAUTH_TOKEN="sdfsdfsdfljlbjkljlkjsdfoiwje" ./acme.sh --issue --dns dns_dnsimple --ecc -d example.com |
生成一次后,会将key记录到 ~/.acme.sh/account.conf 中,下次直接issue这证书即可。
如果需要申请泛域名证书,可以这样:
1 |
./acme.sh --issue --dns dns_dnsimple --ecc -d *.example.com |
这样可以确保主域名和子域名都申请上。
五、自动化部署到nginx
todo
六、群晖上的自动化部署
群晖没有crontab,需要增加–nocron参数才能安装。
这里的步骤参考了官方步骤:https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide
不过官方步骤安装到了 /usr/local/share/acme.sh 目录下,而不是默认的 /root/.acme.sh ,这会导致后续每次运行时候都需要指定参数 --home /usr/local/share/acme.sh ,有点麻烦,建议还是安装到默认的 /root/.acme.sh 位置:
1 |
curl https://get.acme.sh | sh -s email=my@example.com --nocron |
接下来还是和上面一样的步骤来申请证书。部署证书到DSM的步骤如下:
1 2 3 |
export CERT_DOMAIN="your-domain.tld" export SYNO_USE_TEMP_ADMIN=1 ./acme.sh --deploy -d "$CERT_DOMAIN" --ecc --deploy-hook synology_dsm |