如果你的目標不止是truenas, 而是 nginx proxy manager 的反向代理, 參見 給內部ip服務上證書, 且不用自簽署證書 – Nginx Proxy Manager

成果:

在不暴露到公網上的 truenas GUI 上使用來自 let’s encrypt 的證書

需要:

  • 一個域名
  • 一個 truenas scale 服務器
  • 你的DNS服務商必須在這個列表中, 比較常見的阿里雲, 騰訊的dnspod, Cloudflare, Amazon/Azure/Google 都在裡面。如果你的 DNS 提供商是 Cloudflare/Route53/OVH 之一的話, 會方便很多,否則你等會要研究點東西。本例中使用 cloudflare 作為 dns 提供商。

關於自簽署證書

如果你沒有域名, 或是說你想要使用你沒有的域名 (比如 truenas.local 或 truenas.lan之類的), 你需要自己簽發證書

但搞 CA 之類的還要生成證書, 還要讓所有設備都安裝上證書, 怪煩的。

如果你有自己的域名, 但不想把服務暴露到公網, 或是你的服務在局域網內, 沒有或不打算使用公網ip, 你可以試試下文的方法

前言

一般來說, 生成並續約 let’s encrypt 證書要求服務器能夠被公開訪問(80/443端口), 不過對於像我這樣的廢物來說, 把服務暴露到公網還是怪嚇人的。密碼肯定要用超過32位的隨機生成密碼, 但如果你使用的自部署軟件有什麼安全性漏洞, 不就涼涼了嗎? 最安全的還是乾脆只讓局域網訪問服務, 並用vpn 訪問。

參見 https://letsencrypt.org/docs/challenge-types/

let’s encrypt 要求服務器開放 80/443 端口是因為let’s encrypt 的HTTP-01 challenge驗證機制會檢查你的服務 (例如 http://example.com/.well-known/acme-challenge/特定的令牌), 檢查通過了才會給你發證書。

如果你的域名指向的是私有ip, 比如 192.168.66, 或是你的服務做了ip白名單, 或是你的服務在防火牆後面無法被公開訪問, 顯然HTTP-01 challenge就過不去。

但是我們可以用DNS-01 Challenge。這種驗證方式比較麻煩, 但是可以在無法使用 HTTP-01 challenge 時派上用場。

在 TrueNas 中操作

來到 truenas 的 System Settings -> General

右上角, GUI, 設定

GUI SSL Certificate 那邊, 選擇 manage certificate, 進入下面這個頁面。

我們要先創建一個 ACME DNS-Authenticator, 點擊右下角的 Add

給這個authenticator 取個名字, 然後選擇你的 dns 提供商。如果你的dns 提供商是上面列出的幾個, 就選對應的。如果你的dns 提供商沒有列出, 你可以選shell, 然後去研究一下你的dns 提供商的 dns-01 challenge要怎麼做… 或是乾脆把你的dns 轉到 cloudflare吧…

如果你選的是 cloudflare, 就填一下你的 cloudflare 的email

接下來, 我們要去cloudflare 建立一個 API Token
來到 Cloudflare, 進入你域名的頁面

找到 Get your API token, 獲取你的 API Token

使用 Edit zone DNS 的模板就可了

在這裡選擇你的域名, 然後繼續

獲取到 token 之後回到 truenas, 把 api token 填進去。

接著, 我們要先建一個 Certificate Signing Request

Certificate Subject 地址組織隨便寫, 最後兩項, Common Name 是你的域名, Subject Alternative Name 就是, 比如你有 example.comwww.example.com, 就把 www 那個寫在這

然後生成。生成之後這裡就會出現你的 Certificate Signing Requests。點擊那個扳手圖標 (Create ACME Certificate) , 生成一個證書。生成的證書會出現在左邊的 Certificates 那邊。

然後你就可以回到最開始的 System Settings -> General 那邊, 給GUI 指派證書了。把 GUI SSL Certificate 設置成你剛剛創建的證書就可以了。