本篇文章更新時間:2025/11/16
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知或向一介資男的 LINE 社群反應。
如果本站內容對你有幫助,歡迎贊助支持


當你使用 Nginx 伺服器,啟用 HTTPS 協議但沒有設定「預設的伺服器區塊 (default server)」時,在遇到 https://IP_ADDRESS 或未知的 Host 時,會隨機(實際上是第一個)挑一個 HTTPS 虛擬主機回應。這樣做會造成:

  • 別人輸入你的 IP 就會看到某個網站;
  • SSL 憑證不匹配(可能出現警告);
  • 有時會洩漏不該曝光的網站內容。

這問題滿妙的。不解決雖然不會怎樣,但其實能透過 HTTPS://IP 這樣方式就可以知道這台主機上有什麼網站,怎樣都不太踏實。

解決辦法如下:

先自簽一個預設 SSL 憑證

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048  -keyout /usr/local/nginx/conf/ssl/default.key  -out /usr/local/nginx/conf/ssl/default.crt  -subj "/CN=default.invalid"

建立 server 組態

檔案: /usr/local/nginx/conf/default.conf

server {
        #listen 80 default_server;
        #listen [::]:80 default_server;
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        ssl_certificate     /usr/local/nginx/conf/ssl/default.crt;
        ssl_certificate_key /usr/local/nginx/conf/ssl/default.key;
        ssl_reject_handshake on; #v1.19.4 後可以單純用這個阻擋,不需要假憑證
        return 444;
}

修改預設組態

檔案: /usr/local/nginx/conf/nginx.conf

在 vhost 前補上 include default.conf; 引用這組設定後,重新整理組態設定: lnmp reload

後記

基本上現在我都編譯的版本都是 Nginx 1.2x 以上版本了,不用自簽那段也可以直接把預設組態掛上也能發揮效果。

只是這段不會是預設組態會出現的,要自己加入設定才可以。筆記一下~

組態這邊 return 444 就是看要用在 HTTPS 下,還是連 HTTP 也要,可以自由搭配。


Share:

作者: Chun

WordPress 社群貢獻者、開源社群推廣者。專注於 WordPress 外掛開發、網站效能最佳化、伺服器管理,以及 iDempiere 開源 ERP 導入與客製開發。曾參與 WordCamp Taipei 等社群活動,GitHub Arctic Code Vault Contributor。提供資訊顧問、WordPress 開發教學、主機最佳化與企業 ERP 整合服務。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


文章
Filter
Apply Filters
Mastodon