Nginx

Nginx。如何拒絕對未列出的 ssl 虛擬伺服器的請求?

  • September 28, 2021

我在同一個 ip 上有一個萬用字元 SSL 證書和幾個子域。現在我希望我的 nginx 只處理提到的伺服器名稱並為其他伺服器斷開連接,這樣它看起來就像 nginx沒有為未列出的伺服器名稱執行(沒有響應、拒絕、死亡,沒有響應的單個字節)。我執行以下操作

ssl_certificate         tls/domain.crt;
ssl_certificate_key     tls/domain.key;

server {
 listen 1.2.3.4:443 ssl;
 server_name validname.domain.com;
 //
}

server {
 listen 1.2.3.4:443 ssl;
 server_name _;
 // deny all;
 // return 444;
 // return 404;
 //location {
 //  deny all;
 //}
}

我已經嘗試了最後一個伺服器塊中的幾乎所有內容,但沒有成功。我得到來自已知虛擬伺服器的有效響應或錯誤程式碼。請幫忙。

它不是這樣工作的:SSL 握手發生在 HTTP 之前,因此證書上的名稱將在瀏覽器中進行評估,然後您才能重定向或在 nginx 配置中執行任何其他操作。

cjc 的答案已經正確指出了在啟用 SSL 時嘗試匹配主機名的問題。但是,可以這樣做,如下所示:

server {
   ...

   if ($host !~* ^validname\.domain\.com$ ) {
       return 444;
   }
   ...
}

注意:是的,這通常if是 evil,但if在這種情況下使用是安全的。(如果您需要說服自己,請閱讀連結頁面。)

與建議的相反,僅添加以下塊是行不通的:

server {
   listen 80;
   listen 443 ssl;
   return 444;
}

因為匹配的 SSL 證書validname.domain.com不會匹配某個隨機域名。我已經嘗試過了,nginx 的行為就像該塊根本不存在一樣。

這也行不通:

server {
   listen       443;
   server_name    _;
   return 444; 
}

因為它會使埠 443 上的每一個HTTPS 連接都失敗,即使是那些應該通過的連接。我也試過這個。wget報告 SSL 握手錯誤。

引用自:https://serverfault.com/questions/373929