愈來愈多的場合只接受 HTTPS,即使是自己在家裡或內網跑的服務也不例外,因此需要自己生一張 CA 根憑證用來簽發 TLS 憑證,在 Windows/Linux 安裝並信任 CA 根憑證後,便能在自己的王國順跑 HTTPS。

OpenSSL 應是解決這類問題最簡單的答案,過去己整理過做法(延伸閱讀:用 OpenSSL 建立 CA 及簽發 SSL 憑證、使用 OpenSSL 製作萬用字元 SSL 憑證),但步驟實在太繁瑣了,在想,應該有人發明更簡便的做法才對,然後我找到了 mkcert! 若不在意憑證的組織名稱等資訊,只想滿足內部使用的加密傳輸,這個工具可以做到只給主機名稱一次做好 Root CA 憑證跟 TLS 憑證,十分方便。

以下是我在 Linux 用 Docker 執行建立 CA 根憑證、簽發 TLS 憑證的記錄:(註:評估過發現另一個 step-ca 也不錯,能提供 CA 伺服器功能,還支援 ACME 定期自動更新,但評估我的情境不值得多耗資源動用牛刀)

  1. 建立並切換到儲存憑證的目錄
    mkdir ~/my-certs && cd ~/my-certs
    
  2. 執行 Docker 一口氣產生根憑證與網頁憑證 使用 brunoglober/mkcert 映像檔,同時完成「初始化 Root CA」與「簽發憑證」,並將檔案寫到 my-certs 目錄:(我打算簽發一張 *.darkthread.home 萬用字元憑證,並順便讓 127.0.0.1 及 localhost 可以用)
    docker run --rm -v $(pwd):/root/.local/share/mkcert brunopadz/mkcert-docker /bin/sh -c \
    "mkcert -install && mkcert -cert-file /root/.local/share/mkcert/darkthread.home.crt -key-file /root/.local/share/mkcert/darkthread.home.key *.darkthread.home 127.0.0.1 localhost"
    
    若後續要用 CA 根憑證簽發其他憑證,省略 mkcert -install 沿用同一張根憑證即可。若想省事多台伺服器共用一張憑證,則可一次列出每台主機名稱與 IP,或使用 * 萬用字元。
  3. 取得檔案 執行完後,~/my-certs 目錄應會出現:
    • rootCA.pem: 這是 Root CA 的根憑證(複製到 Windows 等客戶端安裝)
    • rootCA-key.pem: 這是根憑證私鑰(需妥善保管,嚴防外流,預設只有 root 可讀)
    • darkthread.home.crt: 網站憑證
    • darkthread.home.key: 網站私鑰 (預設只有 root 可讀寫)

一行指令搞定,讚!

註:實際使用遇到一個小問題是,curl 連 mkcert 憑證網站可能出現 (35) schannel: next InitializeSecurityContext failed: CRYPT_E_NO_REVOCATION_CHECK (0x80092012) 錯誤,原因是憑證未提供憑證撤銷檢查功能,在 Windows 環境會引發錯誤,實測加 --ssl-revoke-best-effort 可以忽略。


Comments

Be the first to post a comment

Post a comment