localhost 的憑證

以丹麥文檢視

以德文檢視

以西班牙文檢視

以芬蘭文檢視

以法文檢視

以希伯來文檢視

以匈牙利文檢視

以日文檢視

以韓文檢視

以俄文檢視

以塞爾維亞文檢視

以烏克蘭文檢視

閱讀簡體中文頁面

使用正體中文閱讀本網頁。

上次更新時間: | 檢視所有文件

有時候,人們會想要取得主機名稱「localhost」的憑證,可能是為了在本地開發中使用,或是為了與需要與網頁應用程式通訊的原生應用程式一起發布。Let's Encrypt 無法提供「localhost」的憑證,因為沒有人獨有它,而且它沒有像「.com」或「.net」這樣的頂級網域。可以設定您自己的網域名稱,使其解析到 127.0.0.1,並使用 DNS 挑戰取得憑證。但是,這通常不是個好主意,而且有更好的選擇。

用於本地開發

如果您正在開發網頁應用程式,最好執行像 Apache 或 Nginx 這樣的本地網頁伺服器,並在您的網頁瀏覽器中透過 http://localhost:8000/ 存取它。但是,網頁瀏覽器在 HTTP 與 HTTPS 頁面上的行為略有不同。主要差異:在 HTTPS 頁面上,任何從 HTTP URL 載入 JavaScript 的請求都會被封鎖。因此,如果您使用 HTTP 在本地開發,您可能會新增一個在您的開發機器上運作良好的 script 標籤,但在您部署到您的 HTTPS 生產網站時會中斷。為了捕捉這類問題,在您的本地網頁伺服器上設定 HTTPS 是有用的。但是,您不希望一直看到憑證警告。您如何在本地取得綠色鎖定?

最佳選擇:產生您自己的憑證,可以是自我簽署的或由本地根憑證簽署的,並在您作業系統的信任儲存區中信任它。然後在您的本地網頁伺服器中使用該憑證。請參閱下方的詳細資訊。

用於與網頁應用程式通訊的原生應用程式

有時,開發人員會想要提供一個可下載的原生應用程式,它可以與網站一起使用,以提供額外的功能。例如,Dropbox 和 Spotify 桌面應用程式會掃描您機器上的檔案,而網頁應用程式是不允許這樣做的。一種常見的方法是讓這些原生應用程式在 localhost 上提供網頁服務,並讓網頁應用程式透過 XMLHTTPRequest (XHR) 或 WebSockets 向其發出請求。網頁應用程式幾乎總是使用 HTTPS,這表示瀏覽器會禁止它向不安全的 URL 發出 XHR 或 WebSockets 請求。這稱為混合內容封鎖。為了與網頁應用程式通訊,原生應用程式需要提供安全的網頁服務。

幸運的是,現代瀏覽器認為 http://127.0.0.1:8000/「可能值得信任」的 URL,因為它指的是迴路位址。傳送到 127.0.0.1 的流量保證不會離開您的機器,因此被認為是自動安全,可防止網路攔截。這表示如果您的網頁應用程式是 HTTPS,而且您在 127.0.0.1 上提供原生應用程式網頁服務,兩者可以透過 XHR 愉快地通訊。不幸的是,localhost 還沒有得到相同的待遇。此外,WebSockets 也沒有為任何名稱獲得此待遇。

您可能會想嘗試透過在全球 DNS 中設定一個網域名稱使其解析到 127.0.0.1(例如,localhost.example.com),取得該網域名稱的憑證,將該憑證和對應的私鑰與您的原生應用程式一起發布,並告訴您的網頁應用程式與 https://localhost.example.com:8000/ 而不是 http://127.0.0.1:8000/ 通訊。不要這樣做。這會讓您的使用者處於風險中,而且您的憑證可能會被撤銷。

透過引入網域名稱而不是 IP 位址,您讓攻擊者可以進行中間人 (MitM) DNS 查詢,並注入指向不同 IP 位址的回應。然後,攻擊者可以假裝是本地應用程式,並將假的回應傳回網頁應用程式,這可能會危及您在網頁應用程式端的帳戶,具體取決於它的設計方式。

之所以可以在這種情況下成功進行 MitM,是因為為了讓它運作,您必須將憑證的私鑰與您的原生應用程式一起發布。這表示任何下載您原生應用程式的人都會取得私鑰的副本,包括攻擊者。這被視為您的私鑰遭到洩漏,如果您的憑證授權機構 (CA) 意識到這點,則必須撤銷您的憑證。許多原生應用程式已因為發布其私鑰被撤銷其憑證

不幸的是,這讓原生應用程式沒有太多好的、安全的方式來與它們對應的網站通訊。而且如果瀏覽器進一步收緊從網頁存取 localhost 的權限,情況在未來可能會變得更加棘手。

另請注意,匯出提供特權原生 API 的網頁服務本質上是危險的,因為您不打算授權的網站可能會存取它們。如果您走這條路,請務必閱讀跨來源資源共享,使用 Access-Control-Allow-Origin,並確保使用記憶體安全的 HTTP 解析器,因為即使您不允許存取的來源也可以傳送預檢請求,這可能會利用您解析器中的錯誤。

製作和信任您自己的憑證

任何人都可以製作自己的憑證,而無需 CA 的協助。唯一的區別在於您自己製作的憑證不會被其他人信任。對於本地開發來說,這沒關係。

為 localhost 產生私鑰和自我簽署憑證的最簡單方法是使用這個 openssl 命令

openssl req -x509 -out localhost.crt -keyout localhost.key \
  -newkey rsa:2048 -nodes -sha256 \
  -subj '/CN=localhost' -extensions EXT -config <( \
   printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

然後,您可以使用 localhost.crt 和 localhost.key 設定您的本地網頁伺服器,並將 localhost.crt 安裝到您的本地信任根清單中。

如果您希望您的開發憑證更逼真一點,您可以使用 minica 來產生您自己的本地根憑證,並發出由它簽署的終端實體(又名葉)憑證。然後,您會匯入根憑證,而不是自我簽署的終端實體憑證。

您也可以選擇使用帶有小數點的網域,例如 www.localhost,方法是將它新增到 /etc/hosts 作為 127.0.0.1 的別名。這會微妙地改變瀏覽器處理 Cookie 儲存的方式。