UNRAID 使用自定义证书教程


Recommended Posts

一、前情摘要

 

目前对于 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

 

image.thumb.png.2a60d714604a76df12a7f57cab84d02e.png

 

ACME_OBTAINED_HOOK 已经内置了, 担心安全问题等请直接查看镜像的 Earthfile https://github.com/mritd/autobuild/tree/main/dnsacme

 

最后说一句, 如果有大佬弄过官方 app 的 template 之类的欢迎帮忙搞到 CA 里.

Edited by kovacs_orz
Link to comment
  • 2 weeks later...
  • 2 weeks later...
On 2/11/2023 at 6:09 AM, Roin said:

这样搞太麻烦了,而且访问 docker 的页面全都得带端口号。

建议你试试 swag,配置完全自动证书,全自动反代 docker,还有 fail2ban,auth 等插件

目前这么做是为了保证 unraid 的直接控制页面不依赖于任何外部应用, 防止在极端情况下的访问可靠性问题;

 

当然作为常规访问我目前直接 caddy 反向代理其他服务, 也是自动化的证书处理.

 

但是向这种通过外部工具 proxy, 就涉及到一个问题: 外部工具部署是否可靠? 如果部署在 unraid 自身, 那么就形成循环依赖; 如果部署在外部则需要单独的硬件设备保证可靠性.

Link to comment
  • 2 weeks later...
On 2/15/2023 at 2:43 PM, kovacs_orz said:

目前这么做是为了保证 unraid 的直接控制页面不依赖于任何外部应用, 防止在极端情况下的访问可靠性问题;

 

当然作为常规访问我目前直接 caddy 反向代理其他服务, 也是自动化的证书处理.

 

但是向这种通过外部工具 proxy, 就涉及到一个问题: 外部工具部署是否可靠? 如果部署在 unraid 自身, 那么就形成循环依赖; 如果部署在外部则需要单独的硬件设备保证可靠性.

没办法,国情特色,反代嵌套我觉得可靠性不太重要,浏览器保存一套裸连的IP书签就行,那些在虚拟机里做openwrt路由的才是真正的勇者

Link to comment
  • 1 year later...

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.