왜 청취 443 default_server; nginx 규칙이 이미 구성된 규칙을 재정의합니다 (http 규칙이 정상적으로 작동 함)?


9

nginx와 다른 하위 도메인이 있습니다.

a.mydomain.com
b.mydomain.com
c.mydomain.com

Nginx에는 4 가지 규칙이 있습니다.

1) 다시 쓰기 규칙 :

server {
  listen 80
  server_name gl.udesk.org;

  root /nowhere;
  rewrite ^ https://a.mydomain.com$request_uri permanent;
}

2) https 규칙 :

server {

  listen 443;
  server_name a.mydomain.com;

  root /home/a/a/public;

  ssl on;
  ssl_certificate conf.d/ssl/a.crt;
  ssl_certificate_key conf.d/ssl/a.key;
  ssl_protocols ...
  ssl_ciphers ...
  ssl_prefer_server_ciphers on;

  location ...
}

3) http 기본 규칙 :

server {
  listen 80 default_server;
  return 444;
}

4) https 기본 규칙 :

server {
  listen 443 default_server;
  return 444;
}

따라서 nginx를 시작하고 다음을 수행하십시오.

  • 브라우저에서 http://a.mydomain.com 으로 이동하면 https://a.mydomain.com으로 리디렉션되고 오류 107 (net :: ERR_SSL_PROTOCOL_ERROR) : SSL 프로토콜 오류가 반환됩니다.
  • 브라우저에서 https://b.mydomain.com으로 이동하면 오류 444가 다시 반환 될 것으로 예상합니다. 그러나 대신 동일한 오류 107 (net :: ERR_SSL_PROTOCOL_ERROR) : SSL 프로토콜 오류를 반환합니다.
  • DNS 제공 업체 CNAME (예 : a, b, c)이 등록한 모든 사람
  • 모든 http 버전 (예 : 규칙 3-)이 예상대로 작동합니다.

그렇다면 왜 nginx 의 https 규칙 이 구성하기가 까다 롭고 http 버전과 동일한 동작을 얻도록 올바르게 구성해야합니까?

최신 정보:

새 인증서 작성 및 추가

ssl on;
ssl_certificate conf.d/ssl/default.crt;
ssl_certificate_key conf.d/ssl/default.key;

지금 작동하지만 SSL 인증서가 필요없는 솔루션이 있습니다. 인증서를 제공하지 않고 https://a.mydomain.com 제외한 모든 https (포트 443) 하위 도메인에 대한 모든 연결을 재설정하기 만하면 됩니다.


2
당신은 할 수 없습니다. SSL은 웹 서버가 원하는 도메인을 알기 전에 인증서 요구합니다 . 보낼 인증서가 있거나 클라이언트와 통신하기위한 연결을 설정할 수 없습니다.
다스 안드로이드

2
@DarthAndroid는 : 마법은 SNI라고 - en.wikipedia.org/wiki/Server_Name_Indication .
Shi

즉, 웹 서버가 선택할 수 있습니다 - @Shi 나는 SNI 알고 있어요 어떤 보낼 인증서,하지만 여전히 선택해야합니다 인증서를. 사용자가 원하는 것에 대한 인증서가 필요하지 않다는 것을 알기에 충분히 똑똑하지 않습니다. nginx
다스 안드로이드

답변:


3

포트 443을 SSL과 혼합하지 마십시오! Nginx는 완전히 포트에 구애받지 않습니다. 포트 80을 통해서도 https를 제공 할 수 있습니다. 최신 nginx 버전은

listen 1234 ssl;

그리고 당신은 ssl on;라인이 필요하지 않습니다 .

그러나 https를 제공하려면 인증서를 지정해야합니다. 서버는 http 요청을 https 요청으로 다시 쓸 때 https를 입력합니다.

SSL 핸드 셰이크가 다른 작업보다 먼저 수행되므로 프로토콜 오류가 발생합니다. 그래서 return 444도달하지 않습니다. 그리고 SSL 핸드 셰이크에는 인증서 / 개인 키 쌍으로 암호화 알고리즘을 제공하기 위해 인증서와 개인 키가 필요합니다.


3

return지시어는 재 작성 모듈의 일부입니다. 문서 를 확인 하면 요청과 함께 작동하는 것을 볼 수 있습니다. HTTPS에서는 핸드 셰이크가 완료된 후에 만 ​​요청을 할 수 있습니다.

기능 요청 : https://trac.nginx.org/nginx/ticket/195가 있으며 해결 방법이 제공됩니다.

server {
    listen 443 ssl;
    server_name bbb.example.com;
    ssl_ciphers aNULL;
    ssl_certificate /path/to/dummy.crt;
    ssl_certificate_key /path/to/dummy.key;
    return 444;
}

(nginx를 자신의 것처럼이 아닌 SNI를 지원하는 HTTPS 클라이언트를 중단합니다 참고 proxy_pass사용자가 설정하지 않는 한 proxy_ssl_server_name on;)에 도달 다른 server_names(그래서 본질적으로 합법적 인 휴식 server_name이 있다고들 않습니다 통해 수 있도록하려는 경우). 자세한 내용은 trac.nginx.org/nginx/ticket/195#comment:11 을 참조하십시오.
nh2 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.