Introduce
根据我的OldTaoge DDNS 服务,证书的分发也可以实现中心化。群晖的证书隐藏的比较深,特此写此文章来记录一下
曾经的尝试
在 /etc/nginx/nginx.conf 直接找到证书的公钥和私钥,并写脚本直接替换
但但但是,nginx -s reload的时候提示了
nginx: [emerg] BIO_new_file("/usr/syno/etc/certificate/system/default/fullchain.pem") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/usr/syno/etc/certificate/system/default/fullchain.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)额
额······
官方的方式
偶然间,我在谷歌(万恶的百度)上找到了这一篇文章 群晖 Let's Encrypt 证书的自动更新
通过观察可以发现,所有证书相关的配置都是在路径/usr/syno/etc/certificate下的,证书存放的具体位置是/usr/syno/etc/certificate/_archive,该目录下的内容形如: 2zFLdC DEFAULT dXWIy3 h94Uuq IhSb6T INFO kGn0Zn uTv2EL vY1OEs WE3xYE 其中INFO的内容是一个JSON文件,记录了每个证书的存放位置和应用的范围,DEFAULT记录了哪一个是默认的证书,其他的目录则是存放一个一个的子域名的证书。 通过观察INFO的内容我们可以发现目录名和域名的对应关系
嗯,真不错。
于是就有了这个自动获取并更新证书的脚本
最终的脚本
LoginID=71726834 LoginToken=ulTEGI9PXMBasun68793LKGJ7ZWFvsQBYpVnd8ao5jmKSL From=34.65.222 ArchivePerfix=yznQiU #echo `curl -X POST https://oldtaoge.space/zhengshu/Getocsp -o /tmp/ocsp.der -d 'LoginID='LoginID'&LoginToken='LoginToken'&From='From` echo `curl -X POST https://oldtaoge.space/zhengshu/Getcert -o /tmp/fullchain.pem -d 'LoginID='LoginID'&LoginToken='LoginToken'&From='From` echo `curl -X POST https://oldtaoge.space/zhengshu/Getkey -o /tmp/privkey.pem -d 'LoginID='LoginID'&LoginToken='LoginToken'&From='From` change=0 for file in fullchain.pem privkey.pem do dif=`diff /tmp/{file} /usr/syno/etc/certificate/system/default/{file}` if [ -zdif ]; then change={change} else cp /tmp/{file} /usr/syno/etc/certificate/_archive/{ArchivePerfix}/{file} cp /tmp/{file} /usr/syno/etc/certificate/system/default/{file} change=1 fi done echo "Change Stauts: change" if [change -eq 1 ]; then cp /usr/syno/etc/certificate/_archive/{ArchivePerfix}/fullchain.pem /usr/syno/etc/certificate/_archive/{ArchivePerfix}/cert.pem if nginx -t > /dev/null 2>&1 ; then echo "Reloading Nginx" /usr/syno/etc/rc.sysv/nginx.sh reload fi fi
就里面那个检测更改的方式,我已经改了不下N次了《······
更好的建议
建议使用群晖自带的任务计划,每次启动获取一遍证书,每晚十二点获取一遍
希望你不要体验到被HSTS界面阻断的乐趣