NGINX 使用它可以找到的第一個 ssl server_block 作為預設值
所以我從 中刪除了我的預設虛擬主機配置
/etc/nginx/sites-available/
,因為我不需要擷取訪問不存在的子域(Debian 9)的使用者。**問題:**當使用 https, fe 呼叫隨機子域時
https://abc.example.com
,NGINX 將應用它的預設行為並使用listen 443
它可以在我的配置文件中找到的第一個伺服器塊。這意味著,當使用者錯誤地使用 https 訪問虛假子域時,他不會收到 404 錯誤(例如呼叫abc.amazon.com或abc.google.com時),而是會收到紅色驚嘆號和certificate name missmatch
錯誤(chrome (NET::ERR_CERT_COMMON_NAME_INVALID
)),這比可以理解的 404 錯誤更可怕。**問題:**有沒有辦法禁用使用它可以找到的第一個 ssl 伺服器塊的預設 nginx 行為?
*哦,並且:*即使重新創建預設虛擬主機(我已經複製了它的備份),NGINX 在使用 https 訪問隨機子域時也會顯示相同的行為。此外,firefox 將使用我的埠
80
伺服器塊將任何流量從 http 重定向到https://www.example.com$request_uri;
. Chrome 會在呼叫隨機子域時將 http 重定向到 https,但保留子域(我從未指定過的規則)。這是/etc/nginx/sites-available/
我目前正在使用的 2 個配置文件。預設(配置,更新)
server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 404; } server { listen 443 ssl default_server; server_name _; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; return 444; }
www.example.com(配置)
server { listen 80; listen [::]:80; server_name example.com www.example.com; include /etc/nginx/snippets/letsencrypt.conf; return 301 https://www.example.com$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com; ssl on; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_dhparam /etc/letsencrypt/live/example.com/dh.pem; ssl_protocols TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; ssl_prefer_server_ciphers on; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; resolver 8.8.8.8; add_header X-Frame-Options "SAMEORIGIN"; add_header x-xss-protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; return 301 https://www.example.com$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.example.com; ssl on; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_dhparam /etc/letsencrypt/live/example.com/dh.pem; ssl_protocols TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; ssl_prefer_server_ciphers on; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; resolver 8.8.8.8; add_header X-Frame-Options "SAMEORIGIN"; add_header x-xss-protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; root /var/www/www.example.com; index index.php; location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } location / { try_files $uri $uri/ =404; } }
**編輯:**這些是我的 DNS 記錄:
(HOST) * (TYPE) A (DESTINATION) MYIP (HOST) @ (TYPE) A (DESTINATION) MYIP and some more for ftp, mail etc
我將如何更改上述 DNS 以僅包含我的子域(imap、webmail、www、smtp)?另外,以下預配置行的目的是什麼?我是否必須將其更改為 imap.example.com 才能正常工作?(我沒有郵件子域)
(HOST) @ (TYPE) MX (MX) 10 (DESTINATION) mail.example.com
… 使用者錯誤地使用 https 訪問了一個錯誤的子域 … 他會得到一個紅色驚嘆號和一個證書名稱不匹配錯誤(chrome (NET::ERR_CERT_COMMON_NAME_INVALID)),這比可以理解的 404 錯誤更可怕。
問題:有沒有辦法禁用使用它可以找到的第一個 ssl 伺服器塊的預設 nginx 行為?
您嘗試解決的問題實際上並不是由 nginx 使用第一個伺服器塊作為預設值引起的。
相反,問題是您沒有與客戶端要求的(子)域匹配的證書,或者如果客戶端訪問此特定子域,您沒有配置 nginx 來提供此證書。這意味著 nginx 將無法為客戶端提供與客戶端訪問的(子)域實際匹配的證書。
由於伺服器的證書必須與 URL 實際匹配是一項基本要求,因此客戶端在所有情況下都會失敗並出現一些可怕的錯誤消息:要麼是因為證書中的主題與 URL 不匹配,要麼是因為證書是不是由受信任的 CA 頒發的(例如在預設塊使用自簽名證書的情況下),或者因為如果客戶端嘗試訪問未配置的域,伺服器會簡單地關閉連接(就像其他 Web 伺服器一樣) .