Nginx는 하위 도메인에 대한 HTTPS 요청을 수신하지 않습니다.

Nginx는 하위 도메인에 대한 HTTPS 요청을 수신하지 않습니다.

웹사이트의 기본 도메인 foo.com과 하위 도메인을 모두 호스팅하는 Nginx 서버가 있습니다 . bar.foo.com내 기본 도메인에 대한 인증서만 있으므로 하위 도메인에 대한 HTTP 요청만 원합니다. 두 서버 블록을 모두 구성했으며 모든 요청이 잘 작동합니다. http://foo.com로 리디렉션되고 HTTP에만 유지됩니다 https://foo.com.http://bar.foo.com

그러나 연결을 시도할 때 문제가 발생합니다 https://bar.foo.com. 443 또는 SSL 요청을 수신하도록 하위 도메인 서버 블록을 구성하지 않았음에도 불구하고 요청이 계속 처리되고 브라우저에서 인증서에 다른 호스트 이름이 있다는 경고가 표시됩니다. 내가 요청한 페이지가 아닌 기본 도메인에서 가져온 페이지입니다 foo.com.

따라서 server내 기본 도메인의 HTTPS 요청만 수신하도록 되어 있던 블록이 어떻게든 하위 도메인의 HTTPS 요청도 수신하고 있는 것 같습니다. 이런 일이 발생하는 것을 원하지 않습니다.

기본 도메인에 대한 구성은 다음과 같습니다.

server {
  listen       80;
  server_name  foo.com www.foo.com;

  return 301 https://$server_name$request_uri;
}

server {
  listen       443 ssl;
  server_name  foo.com www.foo.com;

  ssl                  on;
  ssl_certificate      /etc/nginx/cert/foo.com.pem;
  ssl_certificate_key  /etc/nginx/cert/foo.com.key;
  ...

  location / {
    root   /var/www/foo.com/public_html;
    index  index.html index.htm;
  }
}

하위 도메인에 대한 구성은 다음과 같습니다.

server {
  listen       80;
  server_name  bar.foo.com www.bar.foo.com;

  location / {
    root   /var/www/bar.foo.com/public_html;
    index  index.html index.htm;
  }
}

다음은 Nginx 구성 파일의 일부입니다.

server {
  listen       80 default_server;
  listen       [::]:80 default_server;
  server_name  _;
  root         /usr/share/nginx/html;

  location / {
}

foo.com내 기본 도메인의 443 서버 블록에서 삭제 를 시도했지만 listen도움이 되지 않습니다.

https://bar.foo.comNginx가 요청을 듣지 않거나 단순히 404 또는 444를 반환하기를 바랍니다 .

답변1

포트 443에 대해 하나의 블록만 구성되어 있으므로 server포트 443에 대한 모든 요청을 처리하기 위해 nginx에서 사용하는 기본 가상 서버입니다.

포트 443(TLS)에 대한 기본 서버를 추가하려면 다음 가상 호스트를 추가하면 됩니다.

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

답변2

나는 해결책을 알아 냈습니다. @Tero 및 @Cosmic이 올바르게 지적한 것처럼 기본 도메인에 대한 유일한 443 블록이 모든 443 요청에 대한 server기본 블록으로 설정됩니다 .server

serverNginx 구성 파일의 블록에 주석을 달고 /etc/nginx/nginx.conf다음 두 server블록을 추가했습니다.

server {
  listen      80 default_server;
  server_name  _;
  return 444;
}

server {
  listen       443 ssl default_server;
  server_name  _;
  ssl_certificate      /etc/nginx/cert/foo.bar.pem;
  ssl_certificate_key  /etc/nginx/cert/foo.bar.key;
  return 444;
}

첫 번째 블록은 모든 HTTP 요청에 대한 기본 블록으로 설정되어 server일치하지 않는 요청을 삭제하고, 마찬가지로 두 번째 블록은 일치하지 않는 443 또는 HTTPS 요청을 삭제합니다.

Nginx는 모든 SSL 블록에 대한 인증서를 요구하므로 @Tero가 제공한 솔루션은 작동하지 않으므로 server인증서를 제공해야 합니다.

관련 정보