Nginx
Nginx。如何拒絕對未列出的 ssl 虛擬伺服器的請求?
我在同一個 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 握手錯誤。