kovacs_orz Posted January 19, 2023 Share Posted January 19, 2023 (edited) 一、前情摘要 目前对于 UNRAID 管理公网直接访问, 所以 HTTPS 是必须的; 默认 UNRAID 开启 HTTPS 后采用自签名证书会导致浏览器报错, 而官方提供了一个内置 ACME 方案, 就是使用 unraid.net 域名的带有 ip+hash 前缀的证书; 目前我也是刚刚使用所以尚不清楚官方是否维护了内置的 DDNS, 但是对我来说 ip+hash.unraid.net 这种长域名看着过于眼烦, 本身自己也有短域名, 所以研究了一下如何更换内置的证书为 ACME 的免费证书. 二、简明教程 想要更换内置的自签名证书步骤如下: 1、准备好自己域名的证书, 可使用第三方工具签署(acme.sh、certbot...)或者直接购买 2、证书格式需要为 PEM 格式(里面是 base64 编码的那种) 3、设置 -- 管理权限 -- 使用 SSL/TLS 选择 "是" 4、设置 -- 管理权限 -- 本地顶级域名 填写你自己域名的根域, 例如你打算使用 "abc.example.com" 访问 UNRAID, 则此处填写 "example.com" 5、将你的 “证书” 和 “证书 key” 上传到 UNRAID 系统 6、执行命令覆盖系统证书: `cat "证书绝对路径" “证书key绝对路径” > /boot/config/ssl/certs/$(uname -n)_unraid_bundle.pem` 7、执行命令重载 Nginx: `/etc/rc.d/rc.nginx reload` 三、其他说明 1、设置中的 "本地顶级域名" 必须填写为你自己域名的根域, 这是因为 `/etc/rc.d/rc.nginx` 脚本会检测证书是否匹配, 如果不匹配则还是会重新生成自签名证书 2、系统证书存放于 `/boot/config/ssl/certs/$(uname -n)_unraid_bundle.pem` 文件中, 与常规不同的是这个文件需要同时包含证书和 key; `$(uname -n)` 用于获取当前 UNRAID 名称, 每个服务器都不同. 四、自动化证书管理(我自己的方案) 由于我是采用的 ACME 证书, 所以三个月就过期, acme.sh 工具虽然能定时续期, 但是依赖于 cron 定时任务; 而 unraid 是运行在内存中, 所以很多东西不好持久化, acme.sh 装宿主机就有点难搞. 百思奇想发现 Caddy 自动化 ACME 证书续期就做的很棒, 所以自己研究了一下 Caddy 源码借助 Caddy 的 CertMagic 库挫了一个证书申请小工具: dnsacme https://github.com/mritd/dnsacme 目前这个工具定位是: 1、只支持 DNS 解析方式申请证书, 方便在内网使用(符合国情了属于是) 2、证书申请后提供 hook 脚本方式由用户自行处理 3、自动化续签时仍然能调用 hook 脚本 4、续签失败等也支持 hook 脚本(可以自己发通知啥的) 工具挫完了就很简单了, 直接 docker compose 启动 + 挂载就成 docker-compose.yml version: '3.9' services: dnsacme: image: mritd/dnsacme:unraid container_name: dnsacme restart: unless-stopped network_mode: "host" env_file: .env labels: - "net.unraid.docker.icon=https://github.com/mritd/dnsacme/raw/main/logo.png" volumes: - /mnt/user/composes/dnsacme:/data - /boot/config/ssl/certs:/host_certs - /root/.ssh:/host_ssh compose 总共三个挂载: 1、`/mnt/user/composes/dnsacme` 是我自己的 UNRAID compose 文件专用目录, 因为 certmagic 需要管理证书所以会存储一些证书状态, 这个挂载的目的就是保证重启后 dnsacme 不会无脑重新申请 2、`/boot/config/ssl/certs` 目录存放宿主机证书文件, 挂载后 dnsacme 申请完证书通过 hook 脚本覆盖写入 3、`/root/.ssh` 这个目录比较敏感, 也是无奈之举; dnsacme 写入证书后需要调用 nginx reload, 目前是通过 ssh 方式进行的, 暂时没想到啥其他的好办法. 编写好 compose 后编辑 ".env" 文件, 根据具体的 DNS 提供商自行调整, 具体请参考 https://github.com/mritd/dnsacme#dns-config ACME_OBTAINED_HOOK 已经内置了, 担心安全问题等请直接查看镜像的 Earthfile https://github.com/mritd/autobuild/tree/main/dnsacme 最后说一句, 如果有大佬弄过官方 app 的 template 之类的欢迎帮忙搞到 CA 里. Edited January 19, 2023 by kovacs_orz Quote Link to comment
Roin Posted February 10, 2023 Share Posted February 10, 2023 这样搞太麻烦了,而且访问 docker 的页面全都得带端口号。 建议你试试 swag,配置完全自动证书,全自动反代 docker,还有 fail2ban,auth 等插件 Quote Link to comment
kovacs_orz Posted February 15, 2023 Author Share Posted February 15, 2023 On 2/11/2023 at 6:09 AM, Roin said: 这样搞太麻烦了,而且访问 docker 的页面全都得带端口号。 建议你试试 swag,配置完全自动证书,全自动反代 docker,还有 fail2ban,auth 等插件 目前这么做是为了保证 unraid 的直接控制页面不依赖于任何外部应用, 防止在极端情况下的访问可靠性问题; 当然作为常规访问我目前直接 caddy 反向代理其他服务, 也是自动化的证书处理. 但是向这种通过外部工具 proxy, 就涉及到一个问题: 外部工具部署是否可靠? 如果部署在 unraid 自身, 那么就形成循环依赖; 如果部署在外部则需要单独的硬件设备保证可靠性. Quote Link to comment
Roin Posted February 23, 2023 Share Posted February 23, 2023 On 2/15/2023 at 2:43 PM, kovacs_orz said: 目前这么做是为了保证 unraid 的直接控制页面不依赖于任何外部应用, 防止在极端情况下的访问可靠性问题; 当然作为常规访问我目前直接 caddy 反向代理其他服务, 也是自动化的证书处理. 但是向这种通过外部工具 proxy, 就涉及到一个问题: 外部工具部署是否可靠? 如果部署在 unraid 自身, 那么就形成循环依赖; 如果部署在外部则需要单独的硬件设备保证可靠性. 没办法,国情特色,反代嵌套我觉得可靠性不太重要,浏览器保存一套裸连的IP书签就行,那些在虚拟机里做openwrt路由的才是真正的勇者 Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.