Contents

使用 mkcert 快速建立自簽憑證(Self-Signed Certificate)

常常在本機測試 HTTPS、Webhook、反向代理,或是模擬正式環境時,都會需要一組可以快速拿來用的自簽憑證。以前我自己也會手刻 OpenSSL 指令慢慢生,但後來用了 mkcert 之後,真的方便很多。

它最大的好處是,可以先在本機安裝一個受自己電腦信任的根憑證,後面要再簽出新的測試憑證時,就不用每次都重新匯入。這種做法在內部測試、開發環境,甚至臨時要掛到 Nginx、Kestrel、Traefik 時都很好用。

心智圖

mindmap root((mkcert 快速建立自簽憑證)) 安裝 mkcert Ubuntu apt 安裝相依 下載 mkcert Windows Chocolatey Scoop 建立憑證 mkcert localhost mkcert localhost.com "*.localhost.com" 產生 pem 與 key 安裝信任鏈 mkcert -install 匯入本機根憑證 避免瀏覽器顯示不安全 驗證方式 OpenSSL s_server OpenSSL s_client 瀏覽器測試 額外補充 Windows 憑證管理工具 Ubuntu 匯入 CA Docker 憑證處理

什麼是自簽憑證?

自簽憑證是一種由憑證主體自己簽署的數位憑證,不是由公開受信任的 CA 簽發。它可以提供加密與基本身份識別,但因為不是公認 CA,所以預設通常不會被系統或瀏覽器信任。

先快速理解一下
這類憑證很適合用在內部測試、開發環境、區網服務,或是本機 HTTPS 測試。

Ubuntu 安裝 mkcert

先安裝 mkcert 所需相依套件,再把執行檔放到系統路徑中。

1
2
3
4
5
sudo apt update
sudo apt-get install wget libnss3-tools
curl -JLO "https://dl.filippo.io/mkcert/latest?for=linux/amd64"
chmod +x mkcert-v*-linux-amd64
sudo cp mkcert-v*-linux-amd64 /usr/local/bin/mkcert

安裝完成後,可以用下面指令確認版本:

1
mkcert -version

參考資料: FiloSottile/mkcert: A simple zero-config tool to make locally trusted development certificates with any names you’d like.

Windows 安裝 mkcert

Windows 端安裝更快,直接透過套件管理工具處理即可。

使用 Chocolatey:

1
choco install mkcert

或是使用 Scoop:

1
2
scoop bucket add extras
scoop install mkcert

安裝完成後,同樣可以用下面指令檢查是否成功:

1
mkcert -version

基本使用方式

mkcert 後面可以直接帶網域名稱。執行後通常會產生 .pem 公鑰檔與 -key.pem 私鑰檔。

不過這裡有一個超重要的點:如果你希望這張憑證被自己電腦信任,一定要先做 mkcert -install

1
mkcert -install

如果沒有先安裝本機根憑證,就算你成功建立了憑證,瀏覽器或客戶端連線通常還是會顯示不安全。

這一步不要漏掉

記得先執行 mkcert -install

真的很容易建立完憑證後忘記這一步,最後看到瀏覽器跳出不安全,才回頭找原因。

下面是一個建立萬用字元測試憑證的範例:

1
mkcert localhost.com "*.localhost.com"

執行結果大概會長這樣:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
PS C:\Users\steve\cert> mkcert localhost.com "*.localhost.com"
Note: the local CA is not installed in the system trust store.
Note: the local CA is not installed in the Java trust store.
Run "mkcert -install" for certificates to be trusted automatically

Created a new certificate valid for the following names
 - "localhost.com"
 - "*.localhost.com"

Reminder: X.509 wildcards only go one level deep, so this won't match a.b.localhost.com

The certificate is at "./localhost.com+1.pem" and the key at "./localhost.com+1-key.pem"

It will expire on 27 February 2026

mkcert -install 跑完之後,也可以到 Windows 憑證管理工具或系統信任憑證區查看是否有成功加入。

https://i.meee.com.tw/GhhTvW9.png

到這裡為止,基本上就已經能把產生出來的憑證掛到 Nginx 或其他服務上了。Nginx 的 HTTPS 設定這篇先不展開,如果你要接 Web Server,可以參考這篇:

好記憶不如爛筆頭: [Nginx] NGINX 設定 HTTPS 網頁加密連線,建立自行簽署的 SSL 憑證

Windows 憑證管理小提醒

看到憑證位置不對時先想這個

Windows 有兩個常見憑證管理工具:certlm.msccertmgr.msc

  • certlm.msc 是本機電腦層級的憑證管理。
  • certmgr.msc 是目前使用者層級的憑證管理。

mkcert 預設常見情境會安裝在目前帳戶可用的憑證區,因此如果你打開錯誤的管理工具,很容易以為安裝失敗。

參考來源: Windows证书管理_certmgr.exe-CSDN博客

我自己一開始也有遇過,習慣先開某一個管理工具,然後想說怎麼找不到。後來才發現是看的位置不對。

https://gist.github.com/assets/75846914/b259d618-5927-447f-80f5-3d676f128836

簡單驗證憑證

如果只是想快速確認 mkcert 產生出來的憑證能不能正常用,其實不一定要先上 Nginx。直接用 OpenSSL 啟一個簡單 HTTPS 服務,再用 OpenSSL 或瀏覽器測就很夠用了。

Ubuntu

步驟 1:用 OpenSSL 啟動本地 HTTPS 伺服器

1
openssl s_server -accept 1443 -cert localhost.com+1.pem -key localhost.com+1-key.pem

這樣會直接啟一個簡單的 HTTPS 服務。

為什麼這裡用 1443?
Linux 上如果使用 1024 以下的 Port,通常需要較高權限。用 1443 可以省去額外的 Root 權限問題。

步驟 2:驗證 SSL 憑證

原本我也想直接用 curl 測,但後來發現用自訂 Hostname 測試時,curl 在這個情境下不夠直觀,最後還是 OpenSSL 最穩。

1
curl -H "Host: localhost.com" https://127.0.0.1:1443/

建議直接使用下面的 OpenSSL 指令驗證:

1
openssl s_client -connect 127.0.0.1:1443 -servername localhost.com

可一起參考這篇: Linux 指令確認 SSL 憑證

https://gist.github.com/user-attachments/assets/23a78be9-01d8-477f-81cd-54992e78704e

Windows

Windows 也可以用 OpenSSL 來做一樣的測試。

步驟 0:先建立 localhost 憑證

如果你只是要測本機,直接建立 localhost 憑證會更方便。

1
2
3
4
5
6
# 建立 localhost 憑證
mkcert localhost

# 安裝根憑證
# 如果前面已經安裝過,可以不用重複執行
mkcert -install

步驟 1:安裝 OpenSSL

  1. Shining Light Productions 下載 Windows 版本 OpenSSL。
  2. 安裝後,記得把 OpenSSL 的 bin 目錄加到 PATH。

如果不想自己加環境變數,也可以直接從開始功能表開啟 Win64 OpenSSL Command Prompt

https://gist.github.com/user-attachments/assets/9b49a6d8-32f0-453b-925b-5aa7331fdcbf

步驟 2:啟動本地 HTTPS 伺服器

1
openssl s_server -accept 443 -cert localhost.com+1.pem -key localhost.com+1-key.pem

這會啟動一個簡單的 HTTPS 伺服器,並載入你剛才產生的憑證與私鑰。

步驟 3:用瀏覽器或 OpenSSL 測試

瀏覽器直接開:

1
https://localhost

如果看到安全連線,代表信任鏈大致沒問題。如果還是顯示不安全,就回頭確認 mkcert -install 有沒有做,以及憑證是否有安裝到正確的憑證區。

https://gist.github.com/user-attachments/assets/7eeb71c9-4b81-4392-b991-2d9d7e09983c

另外也可以用 OpenSSL 驗證:

1
openssl s_client -connect localhost:443 -servername localhost.com

https://gist.github.com/user-attachments/assets/cd68e072-0341-40fe-98e0-e5e84c17c0ff

額外補充

Ubuntu 安裝信任憑證

如果你有自己的 CA 憑證需要匯入 Ubuntu,可以把 .crt 檔放到系統信任目錄,再更新憑證清單。

1
2
sudo cp my-certificate.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

更新後,也可以從系統憑證目錄查看:

1
ls /etc/ssl/certs/

想看特定憑證內容時,可以用:

1
openssl x509 -in /etc/ssl/certs/my-certificate.pem -noout -text

Docker 內信任自訂憑證

有時候你不是本機服務要信任,而是 Docker Container 內的應用程式要信任這張 CA,這時候也要把根憑證一起帶進去。

1
2
ADD your_ca_root.crt /usr/local/share/ca-certificates/foo.crt
RUN chmod 644 /usr/local/share/ca-certificates/foo.crt && update-ca-certificates

如果是 Alpine 系統,也可能會看到直接把憑證附加到 ca-certificates.crt 的做法:

1
cat rootCA.crt >> /etc/ssl/certs/ca-certificates.crt

Windows 查 HTTP.SYS SSL 綁定

有時候如果你在 Windows 上測 HTTPS,不一定是憑證問題,也可能是 HTTP.SYS 綁定或 URLACL 的權限問題。

列出目前 SSL/TLS 綁定:

1
netsh http show sslcert | Select-String 'IP:|Certificate Hash|Application ID|Certificate Store|SSL Protocol' | Out-String -stream | ConvertFrom-Csv -Delimiter ":" | Format-Table -AutoSize

列出目前 URLACL:

1
netsh http show urlacl

URLACL 全名是 URL Access Control List,主要是 Windows 用來控管特定 URL 模式可由哪些使用者或服務綁定與使用。像 IIS、WCF,甚至某些自架 HTTP 服務都會碰到這一層。

小結

mkcert 真的是本機 HTTPS 測試的好工具,尤其你只想快速生出一組可信任憑證,不想重新手刻一堆 OpenSSL 指令時,它的效率差很多。

我自己覺得最值得記住的只有兩件事:

  1. 先做 mkcert -install,不然你後面測起來很容易白忙一場。
  2. 要驗證時,先用 OpenSSL 快速起服務與檢查,通常比直接接正式 Web Server 更快定位問題。

彩蛋

如果只是想快速查 mkcert 幾個常用指令,下面這段也很實用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 產生並安裝 CA 憑證到預設位置
mkcert -install

# 查詢 CA 憑證實際存放位置
mkcert -CAROOT

# 指定不同的 CA 儲存路徑
CAROOT=/some/other/place mkcert -install

# 建立 localhost 憑證
mkcert localhost

# 產生 PKCS12 檔案,預設密碼為 changeit
mkcert -pkcs12 localhost

# 指定安裝到哪些信任存放區
TRUST_STORES=system,java,nss mkcert -install

# 移除安裝的 CA
mkcert -uninstall