使用 mkcert 快速建立自簽憑證(Self-Signed Certificate)
常常在本機測試 HTTPS、Webhook、反向代理,或是模擬正式環境時,都會需要一組可以快速拿來用的自簽憑證。以前我自己也會手刻 OpenSSL 指令慢慢生,但後來用了 mkcert 之後,真的方便很多。
它最大的好處是,可以先在本機安裝一個受自己電腦信任的根憑證,後面要再簽出新的測試憑證時,就不用每次都重新匯入。這種做法在內部測試、開發環境,甚至臨時要掛到 Nginx、Kestrel、Traefik 時都很好用。
心智圖
什麼是自簽憑證?
自簽憑證是一種由憑證主體自己簽署的數位憑證,不是由公開受信任的 CA 簽發。它可以提供加密與基本身份識別,但因為不是公認 CA,所以預設通常不會被系統或瀏覽器信任。
Ubuntu 安裝 mkcert
先安裝 mkcert 所需相依套件,再把執行檔放到系統路徑中。
|
|
安裝完成後,可以用下面指令確認版本:
|
|
Windows 安裝 mkcert
Windows 端安裝更快,直接透過套件管理工具處理即可。
使用 Chocolatey:
|
|
或是使用 Scoop:
|
|
安裝完成後,同樣可以用下面指令檢查是否成功:
|
|
基本使用方式
mkcert 後面可以直接帶網域名稱。執行後通常會產生 .pem 公鑰檔與 -key.pem 私鑰檔。
不過這裡有一個超重要的點:如果你希望這張憑證被自己電腦信任,一定要先做 mkcert -install。
|
|
如果沒有先安裝本機根憑證,就算你成功建立了憑證,瀏覽器或客戶端連線通常還是會顯示不安全。
記得先執行 mkcert -install。
真的很容易建立完憑證後忘記這一步,最後看到瀏覽器跳出不安全,才回頭找原因。
下面是一個建立萬用字元測試憑證的範例:
|
|
執行結果大概會長這樣:
|
|
mkcert -install 跑完之後,也可以到 Windows 憑證管理工具或系統信任憑證區查看是否有成功加入。
到這裡為止,基本上就已經能把產生出來的憑證掛到 Nginx 或其他服務上了。Nginx 的 HTTPS 設定這篇先不展開,如果你要接 Web Server,可以參考這篇:
好記憶不如爛筆頭: [Nginx] NGINX 設定 HTTPS 網頁加密連線,建立自行簽署的 SSL 憑證
Windows 憑證管理小提醒
Windows 有兩個常見憑證管理工具:certlm.msc 與 certmgr.msc。
certlm.msc是本機電腦層級的憑證管理。certmgr.msc是目前使用者層級的憑證管理。
mkcert 預設常見情境會安裝在目前帳戶可用的憑證區,因此如果你打開錯誤的管理工具,很容易以為安裝失敗。
參考來源: Windows证书管理_certmgr.exe-CSDN博客
我自己一開始也有遇過,習慣先開某一個管理工具,然後想說怎麼找不到。後來才發現是看的位置不對。
簡單驗證憑證
如果只是想快速確認 mkcert 產生出來的憑證能不能正常用,其實不一定要先上 Nginx。直接用 OpenSSL 啟一個簡單 HTTPS 服務,再用 OpenSSL 或瀏覽器測就很夠用了。
Ubuntu
步驟 1:用 OpenSSL 啟動本地 HTTPS 伺服器
|
|
這樣會直接啟一個簡單的 HTTPS 服務。
步驟 2:驗證 SSL 憑證
原本我也想直接用 curl 測,但後來發現用自訂 Hostname 測試時,curl 在這個情境下不夠直觀,最後還是 OpenSSL 最穩。
|
|
建議直接使用下面的 OpenSSL 指令驗證:
|
|
可一起參考這篇: Linux 指令確認 SSL 憑證
Windows
Windows 也可以用 OpenSSL 來做一樣的測試。
步驟 0:先建立 localhost 憑證
如果你只是要測本機,直接建立 localhost 憑證會更方便。
|
|
步驟 1:安裝 OpenSSL
- 到 Shining Light Productions 下載 Windows 版本 OpenSSL。
- 安裝後,記得把 OpenSSL 的
bin目錄加到 PATH。
如果不想自己加環境變數,也可以直接從開始功能表開啟 Win64 OpenSSL Command Prompt。
步驟 2:啟動本地 HTTPS 伺服器
|
|
這會啟動一個簡單的 HTTPS 伺服器,並載入你剛才產生的憑證與私鑰。
步驟 3:用瀏覽器或 OpenSSL 測試
瀏覽器直接開:
|
|
如果看到安全連線,代表信任鏈大致沒問題。如果還是顯示不安全,就回頭確認 mkcert -install 有沒有做,以及憑證是否有安裝到正確的憑證區。
另外也可以用 OpenSSL 驗證:
|
|
額外補充
Ubuntu 安裝信任憑證
如果你有自己的 CA 憑證需要匯入 Ubuntu,可以把 .crt 檔放到系統信任目錄,再更新憑證清單。
|
|
更新後,也可以從系統憑證目錄查看:
|
|
想看特定憑證內容時,可以用:
|
|
Docker 內信任自訂憑證
有時候你不是本機服務要信任,而是 Docker Container 內的應用程式要信任這張 CA,這時候也要把根憑證一起帶進去。
|
|
如果是 Alpine 系統,也可能會看到直接把憑證附加到 ca-certificates.crt 的做法:
|
|
Windows 查 HTTP.SYS SSL 綁定
有時候如果你在 Windows 上測 HTTPS,不一定是憑證問題,也可能是 HTTP.SYS 綁定或 URLACL 的權限問題。
列出目前 SSL/TLS 綁定:
|
|
列出目前 URLACL:
|
|
URLACL 全名是 URL Access Control List,主要是 Windows 用來控管特定 URL 模式可由哪些使用者或服務綁定與使用。像 IIS、WCF,甚至某些自架 HTTP 服務都會碰到這一層。
小結
mkcert 真的是本機 HTTPS 測試的好工具,尤其你只想快速生出一組可信任憑證,不想重新手刻一堆 OpenSSL 指令時,它的效率差很多。
我自己覺得最值得記住的只有兩件事:
- 先做
mkcert -install,不然你後面測起來很容易白忙一場。 - 要驗證時,先用 OpenSSL 快速起服務與檢查,通常比直接接正式 Web Server 更快定位問題。
彩蛋
- 如何在 Linux 正確建立自簽憑證並讓 ASP.NET Core 網站可以順利進行連線 | The Will Will Web
- mkcert 命令,Linux mkcert 命令詳解:用來產生自簽憑證的工具
- ubuntu - How do I add a CA root certificate inside a docker image? - Stack Overflow
- mkcert and CA certificates - mark.george/Wiki
- Docker: Alpine Linux Container Fails to Accept Certificates
如果只是想快速查 mkcert 幾個常用指令,下面這段也很實用:
|
|