Nginx. 나열되지 않은 SSL 가상 서버에 대한 요청을 어떻게 거부합니까? 거부 되거나 죽지 않고 단일

와일드 카드 SSL 인증서와 동일한 IP에 여러 하위 도메인이 있습니다. 이제 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으로 악한 것이 사실 이지만 if이 경우에는 사용하는 것이 안전합니다 . (자신을 설득해야 할 경우 링크 된 페이지를 읽으십시오.)

제안 된 내용과 반대로 다음 블록을 추가해도 작동하지 않습니다.

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

일치하는 SSL 인증서는 validname.domain.com임의의 임의 도메인 이름과 일치하지 않기 때문 입니다. 나는 그것을 시도했고 nginx는 블록이 전혀없는 것처럼 행동했습니다.

이것은 또한 작동하지 않습니다 :

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

포트 443의 모든 단일 HTTPS 연결이 실패해야 하기 때문에 모든 HTTPS 연결이 실패 하기 때문입니다 . 나는 이것을 시도했다. wgetSSL 핸드 셰이크 오류를보고했습니다.


답변

대부분의 답변은 여기에 대해서입니다 하지, 그렇지 않은 작업을 수행 하는 방법을 작동하도록.

방법은 다음과 같습니다. catch-all 서버를 ‘default_server’로 설정하고 들어오는 SSL 요청을 해독하고 호스트 헤더와 일치시킬 수 있도록 cert / key에 대한 경로를 제공해야합니다.

server {
    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate <path to cert>;
    ssl_certificate_key <path to key>;
    return 404;
}

ssl_certificate / ssl_certificate_key가 있습니다. 지정하지 않으면 nginx는 여전히 이러한 default_server를 사용하려고 시도하고 cert / key가없는 SSL 연결을 수락 할 수 없으므로 실패합니다. 자체 서명과 같은 모든 인증서 / 키를 사용할 수 있습니다. …

자체 서명 된 인증서를 생성하려면 다음을 수행하십시오.

openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365

또한 참조 /server//a/841643/87439


답변

오늘 위의 솔루션을 구현했으며 수영으로 일했습니다. 지정되지 않은 모든 URL이 삭제되었습니다. 실제 가상 서버 항목 앞에이 서버 코드를 배치하는 것이 핵심이었습니다. 이제 모든 잘못된 형식의 URL이이 ‘기본’서버로 이동합니다.

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

server {
     listen       443;
     server_name  [URL]


답변

나열되지 않은 항목을 처리하는 서버를 구성의 첫 번째 서버 블록으로 만들어서이를 처리 할 수 ​​있어야합니다.

http {
    ...

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

    server {
        server_name validname.domain.com;
        ...
    }
}

구체적으로 식별되지 않은 모든 도메인은이 서버 블록에 의해 처리됩니다.


답변