Nginx

NGINX 使用它可以找到的第一個 ssl server_block 作為預設值

  • December 24, 2018

所以我從 中刪除了我的預設虛擬主機配置/etc/nginx/sites-available/,因為我不需要擷取訪問不存在的子域(Debian 9)的使用者。

**問題:**當使用 https, fe 呼叫隨機子域時https://abc.example.com,NGINX 將應用它的預設行為並使用listen 443它可以在我的配置文件中找到的第一個伺服器塊。這意味著,當使用者錯誤地使用 https 訪問虛假子域時,他不會收到 404 錯誤(例如呼叫abc.amazon.comabc.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 伺服器一樣) .

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