群晖DSM证书自动更新
本文最后更新于 287 天前,其中的信息可能已经有所发展或是发生改变。 原创文章保留所有权利,允许提前告知征得同意并在明显位置保留原文链接的转载,任何无视版权的行为将受到搜索引擎的 DMCA 投诉。

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 [ -z $dif ]; 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界面阻断的乐趣

半亩方塘 , 版权所有丨如未注明 , 均为原创丨本网站采用CC BY-NC-SA 3.0 CN反996许可证协议进行授权
转载请注明原文链接:群晖DSM证书自动更新
上一篇
下一篇