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


13

와일드 카드 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;
  //}
}

마지막 서버 블록에서 거의 모든 것을 시도했지만 성공하지 못했습니다. 알려진 가상 서버 또는 오류 코드에서 유효한 응답을 얻습니다. 도와주세요.

답변:


7

SSL 핸드 쉐이크는 HTTP보다 먼저 발생하므로 인증서의 이름은 브라우저에서 평가되어 nginx 구성 내에서 리디렉션하거나 다른 작업을 수행 할 수 있습니다.


이것은 나쁘지만 인정해야합니다) 감사합니다.
andbi

3
이것은 사실이 아닙니다. 다른 답변에서 설명한 것처럼 응답없이 연결을 끊는 것과 같이 하위 수준에서 다른 작업을 수행 할 수 있습니다.
collimarco

13

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 핸드 셰이크 오류를보고했습니다.


5

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

방법은 다음과 같습니다. 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


1
이것을 시도 했습니까? 서버 이름 "_"와 일치하는 SSL 인증서를 작성하는 방법
Tim

예,이 솔루션은 저에게 효과적입니다. 나는 똑같은 문제가 있었고 nginx가 TLS SNI를 보지 않기 때문에 인증서 / 키가 필요하다는 문서에서 알았습니다. 자체 서명과 같은 모든 인증서 / 키를 사용할 수 있습니다.
andreycpp

1

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

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

server {
     listen       443;
     server_name  [URL]

0

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

http {
    ...

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

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

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


1
작동하지 않습니다
AmirHossein
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.