自簽名證書是你自己建立的——你充當自己的憑證授權機構。CA 簽名證書由受信任的憑證授權機構(如 Let’s Encrypt 或 DigiCert)簽發,瀏覽器已經預置了對它們的信任。
實際區別:自簽名證書觸發瀏覽器安全警告,CA 簽名證書不會。
對比
| 自簽名 | CA 簽名 | |
|---|---|---|
| 建立者 | 你(openssl 命令) | 受信任的 CA |
| 瀏覽器信任 | ❌ 警告:“不受信任” | ✅ 鎖頭圖示 |
| 加密強度 | 相同 | 相同 |
| 費用 | 免費 | 免費(Let’s Encrypt)或付費 |
| 驗證 | 無——你為自己擔保 | CA 驗證域名/組織 |
| 使用場景 | 開發、內部、測試 | 生產網站 |
| 續簽 | 手動(你自定有效期) | 90 天(LE)或 1 年(付費) |
| 中間人攻擊防護 | ⚠️ 弱——使用者被訓練點選跳過警告 | ✅ 強——僅真正問題時顯示警告 |
為什麼自簽名證書顯示警告
瀏覽器基於簽名者來信任證書。你的作業系統和瀏覽器自帶約 100-150 個受信任的根 CA 列表。當伺服器出示由這些 CA 之一簽名的證書時,瀏覽器顯示鎖頭圖示。
自簽名證書不是由任何受信任的 CA 簽名的——它由自己的私鑰簽名。瀏覽器無法驗證證書是否合法,因此顯示警告。這是正確的行為——沒有 CA 驗證,任何人都可以建立聲稱是 google.com 的證書。
何時使用自簽名證書
內部服務
不暴露於網際網路的服務——內部儀表板、監控工具、資料庫管理面板。你的團隊可以將自簽名 CA 新增到他們的信任儲存中。
開發和測試
本地開發的快速 HTTPS,當你不想設定 mkcert 時。瀏覽器警告雖然煩人,但測試時功能上沒問題。
物聯網和嵌入式裝置
與已知伺服器通訊並可以固定證書的裝置——不涉及瀏覽器信任儲存。
隔離網路
沒有網際網路訪問的網路,Let’s Encrypt 的 ACME 協議無法觸達。自簽名是唯一選擇。
何時不應使用自簽名證書
任何面向公眾的網站
使用者看到嚇人的警告然後離開。搜尋引擎可能不會抓取使用不受信任證書的 HTTPS 頁面。當 Let’s Encrypt 證書免費時,沒有理由使用自簽名。
任何處理使用者資料的站點
自簽名證書訓練使用者點選跳過安全警告——這與良好安全實踐恰恰相反。當真正的攻擊觸發警告時,習慣點選”繼續訪問”的使用者不會注意到。
如何建立自簽名證書
# ECDSA (recommended)
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:P-256 \
-keyout key.pem -out cert.pem -days 365 -nodes \
-subj "/CN=internal.example.com" \
-addext "subjectAltName=DNS:internal.example.com,IP:10.0.0.5"
# RSA
openssl req -x509 -newkey rsa:2048 \
-keyout key.pem -out cert.pem -days 365 -nodes \
-subj "/CN=internal.example.com"
在伺服器配置中使用生成的 cert.pem 和 key.pem。注意:不需要 fullchain.pem 和 chain.pem——自簽名證書沒有證書鏈。
每種場景的更好替代方案
| 場景 | 替代自簽名,使用 |
|---|---|
| 生產網站 | Let’s Encrypt 透過 GetHTTPS —— 免費、受信任、5 分鐘 |
| 本地開發 | mkcert —— 本地受信任、無警告 |
| 內部服務 | Let’s Encrypt(如果可訪問網際網路)或私有 CA |
| 測試/預釋出 | Let’s Encrypt 暫存環境 —— 無限測試證書 |
當 SSL 證書每年需要 $100 以上時,自簽名證書是有意義的。現在 Let’s Encrypt 免費,除了真正隔離的環境外,幾乎沒有理由使用自簽名。
常見問題
自簽名證書比 CA 簽名的安全性低嗎?
加密完全相同——相同的演算法、相同的金鑰強度。區別在於信任:CA 簽名證書透過受信任的第三方證明伺服器身份。自簽名證書什麼都不證明——任何人都可以為任何域名建立一個。安全問題不在密碼學,而在缺乏認證。
能讓瀏覽器信任我的自簽名證書嗎?
可以,在你控制的機器上。將證書(或簽署它的自簽名 CA)匯入作業系統/瀏覽器信任儲存。這就是 mkcert 自動化的操作。但你不能讓其他人的瀏覽器信任它——那需要真正的 CA。
我的主機商給了我自簽名證書,這可以嗎?
對於公開網站,不行。讓你的主機商啟用免費的 Let’s Encrypt(大多數主機都支援)。如果他們不支援,使用 GetHTTPS 自己獲取受信任的證書。
為什麼不直接建立自己的 CA?
可以,但瀏覽器不會信任它,除非你經歷了漫長且昂貴的加入瀏覽器信任儲存的過程。私有 CA 適用於內部基礎設施(你的團隊安裝根證書),但不適用於公開網站。對於公開站點,使用受信任的 CA 如 Let’s Encrypt。