使用 mkcert 在 Windows 本機自行簽發 HTTPS 憑證

在本機開發 Web 服務時,常常會遇到需要 HTTPS 的情境,例如測試 Cookie 的 Secure 屬性、Service Worker、OAuth callback,或是模擬正式環境的安全連線。如果只是為了開發環境而申請公開憑證,流程通常太重;這時可以使用 mkcert 在本機建立受信任的開發用憑證。

mkcert 會在本機建立一個 local CA,並將它加入系統信任存放區,之後再透過這個 local CA 簽發指定網域使用的憑證。本文會示範如何在 Windows 上使用 winget 安裝 mkcert,並產生可供本機服務使用的 HTTPS 憑證。


前置需求

開始前,請先確認環境具備以下條件:

  • Windows 10 或 Windows 11
  • 已安裝 Windows Package Manager,也就是 winget
  • 可開啟 PowerShell 或 Windows Terminal
  • 具備安裝憑證時的系統授權

如果不確定是否已安裝 winget,可以先執行以下指令確認版本:

1
winget --version

使用 winget 安裝 mkcert

開啟 PowerShell 後,執行以下指令安裝 mkcert

1
winget install -e --id FiloSottile.mkcert

其中 -e 代表使用精確比對,--id FiloSottile.mkcert 則指定要安裝的套件識別碼。安裝過程中,winget 會下載對應版本的 mkcert 並設定命令列別名。

安裝完成後,如果終端機提示環境變數已更新,建議關閉目前的 PowerShell 視窗後重新開啟,讓新的 mkcert 指令可以被正確載入。

建立本機信任的 CA

安裝好 mkcert 之後,接著要建立本機使用的憑證授權單位,也就是 local CA。執行以下指令:

1
mkcert -install

執行時,Windows 會跳出安全性警告,詢問是否要將這個 CA 憑證安裝到受信任的根憑證授權單位中。這一步是讓瀏覽器與系統信任後續由 mkcert 簽發憑證的關鍵,因此若確認是在自己的開發機上操作,就選擇「是」。

完成後,終端機會顯示 local CA 已安裝到系統信任存放區。如果電腦上有 Java 環境,mkcert 也會嘗試將 local CA 安裝到 Java 的 trust store,方便 Java 應用程式在本機開發時使用。

讓 VirtualBox VM 與 WSL 信任同一個 local CA

mkcert -install 會將 local CA 安裝到目前 Windows 主機的信任存放區,但 VirtualBox VM 與 WSL 都有各自的憑證信任環境。如果瀏覽器、curl、後端程式或其他工具是在 VM 或 WSL 裡執行,就需要另外將 mkcertrootCA.pem 匯入到該環境,才會信任由這個 local CA 簽發的憑證。

可以先在 Windows PowerShell 中確認 local CA 的存放位置:

1
mkcert -CAROOT

這個資料夾中會看到 rootCA.pemrootCA-key.pem。需要複製到 VM 或 WSL 的是 rootCA.pem,它是 local CA 的公開憑證;rootCA-key.pem 是 local CA 的私鑰,不應該複製到其他環境,也不要提交到 Git repository。

如果 VirtualBox 裡跑的是 Linux VM,可以先透過 scp 或 VirtualBox shared folder 將 rootCA.pem 複製進 VM。以下以 scp 為例:

1
2
$caRoot = mkcert -CAROOT
scp "$caRoot\rootCA.pem" user@192.168.56.10:/tmp/rootCA.pem

接著在 Debian 或 Ubuntu 系列的 Linux VM 中執行:

1
2
sudo cp /tmp/rootCA.pem /usr/local/share/ca-certificates/mkcert-rootCA.crt
sudo update-ca-certificates

如果是 RHEL、CentOS 或 Fedora 系列,可以改用:

1
2
sudo cp /tmp/rootCA.pem /etc/pki/ca-trust/source/anchors/mkcert-rootCA.pem
sudo update-ca-trust

如果 VirtualBox 裡跑的是 Windows VM,則可以用系統管理員權限開啟 PowerShell,將 rootCA.pem 匯入受信任的根憑證授權單位:

1
Import-Certificate -FilePath .\rootCA.pem -CertStoreLocation Cert:\LocalMachine\Root

WSL 也不會自動共用 Windows 的憑證信任存放區,因此同樣需要把 rootCA.pem 匯入 Linux 的 CA trust store。可以先從 Windows PowerShell 複製到指定的 WSL 發行版,以下以 Ubuntu 為例:

1
2
3
$caRoot = mkcert -CAROOT
$distro = "Ubuntu"
Copy-Item "$caRoot\rootCA.pem" "\\wsl$\$distro\tmp\rootCA.pem"

接著進入 WSL 後執行:

1
2
sudo cp /tmp/rootCA.pem /usr/local/share/ca-certificates/mkcert-rootCA.crt
sudo update-ca-certificates

完成後,WSL 裡的 curl、Node.js、Python、Nginx 或其他會讀取系統 CA trust store 的工具,就能信任由同一個 mkcert local CA 簽發的憑證。不過如果是自訂網域,例如 inter.springtest.dev,還是要確認 VM 或 WSL 內部也能正確解析這個網域;憑證信任與網域解析是兩件不同的事。

產生本機開發用憑證

local CA 建立完成後,就可以替本機開發網域產生憑證。以下範例會替 inter.springtest.devlocalhost127.0.0.1::1 產生同一組憑證:

1
mkcert inter.springtest.dev localhost 127.0.0.1 ::1

這些名稱會被寫入憑證的 Subject Alternative Name,因此瀏覽器連到這些網域或 IP 時,都可以使用同一張憑證完成 HTTPS 驗證。

指令完成後,mkcert 會在目前目錄產生兩個檔案:

  • inter.springtest.dev+3.pem:憑證檔案
  • inter.springtest.dev+3-key.pem:私鑰檔案

這兩個檔案就是後續設定 Web Server、Reverse Proxy 或後端框架 HTTPS 時會用到的內容。私鑰檔案只應保存在本機開發環境,不建議提交到 Git repository。

設定 hosts 網域對應

如果憑證是針對自訂網域產生,例如 inter.springtest.dev,還需要讓這個網域能解析到本機。Windows 的 hosts 檔案位置在:

1
C:\Windows\System32\drivers\etc\hosts

用系統管理員權限開啟文字編輯器後,在 hosts 檔案中加入以下設定:

1
127.0.0.1 inter.springtest.dev

設定完成後,瀏覽器或本機服務連到 inter.springtest.dev 時,才會正確導向目前這台開發機。如果沒有設定 hosts,即使憑證已經產生完成,瀏覽器也可能無法連到正確的本機服務。

將憑證套用到本機服務

產生憑證後,需要依照使用的服務或框架設定 HTTPS。不同工具的設定方式會不同,但核心概念都是指定憑證檔與私鑰檔。

例如常見的設定會需要填入:

1
2
certificate: inter.springtest.dev+3.pem
private key: inter.springtest.dev+3-key.pem

如果使用的是 Nginx、Caddy、Node.js、Spring Boot 或其他開發伺服器,只要將對應欄位指向這兩個檔案即可。設定完成後,透過瀏覽器開啟 HTTPS 網址,應該可以看到已建立安全連線。

常見注意事項

使用 mkcert 時,可以特別留意以下幾點:

  • mkcert 產生的是本機開發用途憑證,不適合部署到正式環境。
  • 如果憑證是針對自訂網域產生,例如 inter.springtest.dev,需要確認 hosts 檔案已有對應設定。
  • VirtualBox VM 與 WSL 有各自的憑證信任存放區,需要另外匯入 rootCA.pem 才會信任同一個 local CA。
  • 只需要複製 rootCA.pem 到其他開發環境,不要複製或外流 rootCA-key.pem
  • 重新安裝或更換電腦後,需要重新執行 mkcert -install 並重新產生憑證。
  • 私鑰檔案應妥善保存,不要上傳到公開儲存庫。

小結

透過 winget 安裝 mkcert 後,只需要幾個指令就能在 Windows 本機建立可信任的開發用 HTTPS 憑證。整體流程可以整理如下:

1
2
3
4
winget install -e --id FiloSottile.mkcert
mkcert -install
mkcert -CAROOT
mkcert inter.springtest.dev localhost 127.0.0.1 ::1

對於需要在本機模擬 HTTPS 的開發情境來說,mkcert 的設定成本低,也能避免瀏覽器不信任自簽憑證造成的測試干擾。如果開發流程會跨到 VirtualBox VM 或 WSL,也只要額外匯入 rootCA.pem,就能讓不同環境信任同一個 local CA。只要記得它是開發環境工具,不要把 local CA、憑證與私鑰混用到正式環境,就能安全且方便地完成本機 HTTPS 測試。