Nginx. Làm cách nào để từ chối yêu cầu đến máy chủ ảo ssl chưa niêm yết?


12

Tôi có chứng chỉ SSL ký tự đại diện và một số tên miền phụ trên cùng một ip. Bây giờ tôi muốn nginx của tôi chỉ xử lý các tên máy chủ được đề cập và bỏ kết nối cho những người khác để nó trông giống như nginxkhông chạy cho các tên máy chủ không được liệt kê (không phản hồi, từ chối, chết, không phải là một byte trong phản hồi). Tôi làm như sau

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;
  //}
}

Tôi đã thử hầu hết mọi thứ trong khối máy chủ cuối cùng, nhưng không thành công. Tôi nhận được phản hồi hợp lệ từ máy chủ ảo đã biết hoặc mã lỗi. Xin vui lòng giúp đỡ.

Câu trả lời:


7

Nó không hoạt động theo cách đó: bắt tay SSL xảy ra trước HTTP, vì vậy tên trên chứng chỉ sẽ được đánh giá trong trình duyệt trước khi bạn có thể chuyển hướng hoặc làm bất cứ điều gì khác trong cấu hình nginx.


Điều này là xấu, nhưng phải thừa nhận) Cảm ơn.
andbi

3
Điều này không đúng: bạn có thể làm một cái gì đó khác ở cấp độ thấp hơn, như bỏ kết nối mà không có bất kỳ phản hồi nào, như được giải thích trong các câu trả lời khác.
collimarco

12

Câu trả lời của cjc đã chỉ ra chính xác vấn đề khi thử khớp tên máy chủ khi SSL được bật. Tuy nhiên, có thể làm điều đó, như thế này:

server {
    ...

    if ($host !~* ^validname\.domain\.com$ ) {
        return 444;
    }
    ...
}

Lưu ý: đúng là nói chung iflà xấu , nhưng nó an toàn để sử dụng iftrong trường hợp này. (Đọc trang được liên kết nếu bạn cần thuyết phục bản thân.)

Trái với những gì đã được đề xuất, chỉ cần thêm khối sau sẽ không hoạt động:

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

bởi vì chứng chỉ SSL validname.domain.comkhông khớp với một số tên miền ngẫu nhiên. Tôi đã thử nó và nginx đã hành động như khối không có mặt ở tất cả.

Điều này cũng sẽ không hoạt động:

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

bởi vì nó sẽ làm cho mọi kết nối HTTPS trên cổng 443 không thành công, ngay cả những kết nối nên đi qua. Tôi cũng đã thử cái này rồi. wgetbáo cáo lỗi bắt tay SSL.


4

Hầu hết các câu trả lời ở đây là về lý do tại sao nó không hoạt động, không phải làm thế nào để làm cho nó hoạt động.

Đây là cách - bạn cần biến máy chủ bắt tất cả đó thành 'default_server' và cần cung cấp đường dẫn đến cert / key để có thể giải mã yêu cầu ssl đến và khớp với tiêu đề Máy chủ:

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;
}

Lưu ý ssl_cert ve / ssl_cert ve_key ở đó. Nếu chúng không được chỉ định, nginx vẫn cố gắng sử dụng default_server đó và không thành công vì nó không thể chấp nhận kết nối ssl w / oa cert / key. Người ta có thể sử dụng bất kỳ chứng chỉ / khóa nào, ví dụ như tự ký. ...

Để tạo chứng chỉ tự ký:

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

Đồng thời xem /server//a/841643/87439


1
Bạn đã thử điều này? Làm thế nào để bạn tạo chứng chỉ SSL khớp với tên máy chủ của "_"?
Tim

Vâng, giải pháp này làm việc cho tôi. Tôi đã có cùng một vấn đề chính xác và nhận ra từ tài liệu rằng nginx cần chứng chỉ / khóa vì nó không nhìn vào TLS SNI. Bạn có thể sử dụng bất kỳ chứng chỉ / khóa nào, ví dụ như tự ký.
andreycpp 30/03/2017

1

Tôi đã thực hiện các giải pháp trên ngày hôm nay, và nó hoạt động một cách bơi lội. Tất cả các URL không được chỉ định đều bị loại bỏ. Đặt mã máy chủ này trước khi nhập máy chủ ảo thực tế là chính - tất cả các URL được tạo thành giờ đều chuyển đến máy chủ 'mặc định' này.

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

server {
     listen       443;
     server_name  [URL]

0

Bạn sẽ có thể xử lý việc này bằng cách đặt máy chủ xử lý các mục không được liệt kê thành khối máy chủ đầu tiên trong cấu hình của bạn.

http {
    ...

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

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

Tất cả các tên miền không được xác định cụ thể sẽ được xử lý bởi khối máy chủ này.


1
Nó không hoạt động
AmirHossein
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.