讓Chrome信任自簽名證書(Unix系列OS)
背景
想在本地測試自己寫的基于HTTPS連接的Web應用,跑在3001端口。但使用Chrome瀏覽器訪問https://localhost:3001時顯示連接不安全。
解決了但沒解決
使用mkcert一鍵創建證書:
mkcert localhost 127.0.0.1
在當前目錄下生成兩個文件:localhost+1-key.pem和localhost+1.pem,這里面+1表示附加1個SAN 條目(127.0.0.1)。
然后將本機mkcert添加到系統信任的根證書頒發機構:
mkcert --install
控制臺顯示
Created a new local CA 💥
Sudo password: (因為要修改系統信任,需要sudo權限)
The local CA is now installed in the system trust store! ??
Mac用戶可以在~/Library/'Application Support'/mkcert/
中找到兩個新生成的根證書rootCA-key.pem和rootCA.pem,并且在 鑰匙串訪問-系統鑰匙串-系統 找那個看到一個新的證書mkcert 本機名。
【溫馨提示】Mac的Finder默認隱藏Library文件夾,可以從 前往-前往文件夾… 中輸入~/Library/‘Application Support’/mkcert/進入該文件夾。
雙擊rootCA.pem文件可進入 鑰匙串訪問 應用。
在服務器端代碼中,使用
const key = await readFile("./certs/localhost+1-key.pem");
const cert = await readFile("./certs/localhost+1.pem");const httpsServer = createServer({key,cert
},(req, res)=>{});
根據別人的教程,到這問題就該解決了。但當我再使用Chrome瀏覽器訪問https://localhost:3001時,仍然顯示連接不安全。清除瀏覽器緩存沒有用,檢查瀏覽器信任證書也沒有問題。
最終解決
再問Grok怎么為localhost生成自簽名證書,發現它教我的命令中多了一個::1
mkcert localhost 127.0.0.1 ::1
這個::1是IPv6的本地回環地址。該命令執行后生成兩個文件localhost+2-key.pem和localhost+2.pem。
在服務器代碼中將localhost+1-key.pem, localhost+1.pem替換為localhost+2-key.pem, localhost+2.pem,再從瀏覽器中訪問https://localhost:3001,就不會顯示連接不安全了。
溯源
但為什么我的證書中已經簽給了localhost,訪問的也是localhost,但它非要驗證IPv6證書的安全性呢?
打開瀏覽器的開發者工具,重加載頁面,看 網絡-請求-遠程地址 欄目,發現當我們請求訪問localhost的時候,瀏覽器默認將localhost解析為了IPv6的回環地址。(如果沒有 遠程地址 欄,可以通過 右鍵請求-標頭選項 添加 遠程地址)
主流瀏覽器(如 Chrome、Firefox、Edge)通常遵循操作系統的地址解析優先級。如果 localhost 解析到 ::1 且系統支持 IPv6,瀏覽器可能會首先嘗試通過 ::1 連接。