Điểm:1

thiết lập nginx để yêu cầu các điều kiện nhất định của vị trí cho tất cả trừ một IP nguồn nhất định

lá cờ de

Tôi đang tìm kiếm một thiết lập mà tôi muốn có chứng chỉ ứng dụng khách SSL cho tất cả trừ một IP nguồn.

Ý tưởng của tôi là thiết lập

 ssl_verify_client tùy chọn;

và để thêm một câu lệnh if phức tạp vào các vị trí. Tuy nhiên tôi không biết làm thế nào để viết một câu lệnh if như vậy.

  # điều này yêu cầu chứng chỉ ứng dụng khách ssl cho tất cả các vị trí
  địa điểm / {
    if ($ssl_client_verify != "THÀNH CÔNG") { 
       trả lại 403; 
    ...
  }

  # bây giờ phải viết gì để yêu cầu chứng chỉ ssl trừ khi IP nguồn là ví dụ: 1.2.3.4
  địa điểm /hai {
    nếu (?????) { 
       trả lại 403; 
    ...
  }

Chỉnh sửa: Thông tin bổ sung

công tắc ssl_verify_client với giá trị không bắt buộc nói với khách hàng rằng họ có thể nhưng không phải gửi chứng chỉ ứng dụng khách.

Vì vậy, bằng cách kiểm tra biến $var_ssl_client_verify Tôi có thể xem chứng chỉ ứng dụng khách đã được xuất trình và hợp lệ hay chưa (THÀNH CÔNG) hay không. Quy tắc này sẽ được áp dụng cho tất cả các máy khách không có IP nguồn nhất định. Đối với một IP nguồn cụ thể, tôi không muốn xác minh chứng chỉ ứng dụng khách.

Những gì tôi cần là một cái gì đó như

    if ($ssl_client_verify != "THÀNH CÔNG" and source_ip != 1.2.3.4 ) { 
       trả lại 403; 
    }

Chỉnh sửa 2: Tôi đã thay đổi tiêu đề từ thiết lập nginx để yêu cầu chứng chỉ ứng dụng khách cho tất cả trừ một IP nguồn nhất định đến thiết lập nginx để yêu cầu các điều kiện nhất định của vị trí cho tất cả trừ một IP nguồn nhất định vì những gì tôi thực sự đang gặp khó khăn không liên quan gì đến chứng chỉ ứng dụng khách, mà liên quan đến việc kết hợp các câu lệnh if và lọc có điều kiện trên địa chỉ IP nguồn.

lá cờ us
Sử dụng `if` bên trong các vị trí không hoạt động như bạn mong đợi: https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/
Điểm:1
lá cờ sv

Nhiều điều kiện không được hỗ trợ trong Nginx cho nếu bản tường trình. Vì vậy, như một giải pháp thay thế và vì IP máy khách được đánh giá trong ca sử dụng của chúng tôi, giải pháp có thể đạt được tương tự như cách đạt được tại https://www.nginx.com/blog/rate-limiting-nginx/#Advanced-Configuration-Examples . Về cơ bản, giải pháp diễn ra như thế này ...

địa lý $limit {
    mặc định 1;
    1.2.3.4 0; #vui lòng thay thế IP ví dụ bằng IP thực tế.
}

ssl_verify_client tùy chọn;
ssl_client_certificate /path/to/cert.pem;

bản đồ $limit $limit_key {
    0 "THÀNH CÔNG";
    1 $ssl_client_verify;
}

người phục vụ {
    # ... chỉ thị khác
    địa điểm / {
        if ( $limit_key != 'THÀNH CÔNG' ) { return 403; }
        # ... chỉ thị khác
    }
}

Về cơ bản, chúng tôi gán giá trị "THÀNH CÔNG" cho biến cho một IP cụ thể. Đối với mọi IP khác, chúng tôi chỉ định giá trị thực của $ssl_client_verify.

câu trả lời thay thế

ssl_verify_client tùy chọn;
ssl_client_certificate /path/to/cert.pem;
người phục vụ {
    # ... chỉ thị khác
    
    # giá trị ban đầu của $variable là giá trị thực của $ssl_client_verify
    đặt $variable $ssl_client_verify;

    # ở đây chúng tôi gán lại biến $ với "THÀNH CÔNG" cho IP cụ thể của chúng tôi
    # vui lòng thay thế 1.2.3.4 bằng IP thực
    nếu ( $remote_addr = "1.2.3.4") {
        đặt biến $ "THÀNH CÔNG";
    }

    địa điểm / {
        if ( $variable != 'THÀNH CÔNG' ) { return 403; }
        # ... chỉ thị khác
    }
}
lá cờ sv
@gelonida Xin lỗi vì đã hiểu sai câu hỏi của bạn ban đầu.
gelonida avatar
lá cờ de
Cảm ơn câu trả lời của bạn. Điều này nên làm công việc. Vì vậy, ý tưởng là sử dụng `geo` để ánh xạ địa chỉ ip nguồn, các câu lệnh `map` để tạo một biến, biến này cuối cùng có thể được sử dụng trong `if ($variable != "SUCCESS") { return 403; }` Liên quan đến hiểu lầm ban đầu. Nó khiến tôi viết lại câu hỏi của mình (hy vọng) theo một cách ít mơ hồ và chung chung hơn. Sẽ đánh dấu câu hỏi là OK ngay khi tôi có cơ hội thử nghiệm trong môi trường của mình. Trong thực tế, kịch bản của tôi phức tạp hơn một chút vì địa chỉ IP sẽ được xác định thông qua giao thức proxy.
lá cờ sv
@gelonida Bạn nói đúng. Vui lòng xem câu trả lời được cập nhật bao gồm giải pháp thay thế.
gelonida avatar
lá cờ de
Câu trả lời thay thế đang làm việc cho tôi. Không thử cho đến nay cái đầu tiên.
lá cờ sv
Vui mừng khi biết nó đã làm việc.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.