Nginx từ chối tên máy chủ không xác định qua HTTPS


7

Tôi có một ví dụ Nginx sử dụng SNI để phục vụ nhiều tên miền HTTPS từ một IP.

Vấn đề duy nhất với thiết lập là Nginx phản hồi với tên miền đầu tiên (đóng vai trò mặc định) bất cứ khi nào URL cho IP trống của máy chủ hoặc tên miền được liệt kê tại IP đó không có khối máy chủ HTTPS tương ứng, được yêu cầu. Trong trường hợp này, tôi rất muốn trả lại một Cấm 403 tiêu chuẩn - Tôi sẽ thiết lập một khối máy chủ mặc định để làm điều này nhưng tôi không thể thấy cách nào xung quanh các cảnh báo không khớp với chứng chỉ ứng dụng khách.

(Làm thế nào c | C) tôi định cấu hình Nginx để từ chối các yêu cầu đến các miền không xác định / không xác định như vậy mà không cần chỉ định một chứng chỉ ssl cụ thể sẽ làm đảo lộn các trình duyệt? (tức là tôi cần Nginx từ chối yêu cầu với 403 trước khi làm phiền khách hàng với chứng chỉ "xấu" - từ POV của khách hàng, điều này hoàn toàn giống với trường hợp không có khối máy chủ HTTPS nào được xác định.)

Câu trả lời:


7

Câu hỏi này khá giống với câu hỏi tôi đã trả lời hôm qua: nginx và SNI: có thể tự động giải quyết chứng chỉ SSL theo tên miền không

Không thể từ chối kết nối trước khi người dùng nhìn thấy thông báo chứng chỉ xấu trong trình duyệt của mình. Vào thời điểm Nginx có thể trả về câu trả lời HTTP 403, bắt tay SSL đã kết thúc và để hoàn thành bắt tay, trình duyệt phải chấp nhận chứng chỉ được cung cấp. Bạn chỉ có thể từ chối kết nối sau khi người dùng chấp nhận chứng chỉ bằng cách thiết lập máy chủ mặc định:

server {
    listen 433 default_server ssl;
    ssl_certificate       common.crt;
    ssl_certificate_key   common.key;
    return 403;
}

Tuy nhiên, hầu hết các trình duyệt gần đây đều hỗ trợ Chỉ định Tên Máy chủ và nếu bạn có bộ chứng chỉ cho mỗi vhost, người dùng bình thường sẽ không thấy thông báo đó.

Có thể từ chối các kết nối mà không có tên máy chủ hợp lệ được chỉ định bởi SSL với iptables nhưng điều đó có thể khá khó khăn và hoàn toàn không tuân thủ bất kỳ tiêu chuẩn nào.

Thông tin cập nhật: Có thể return 444hủy kết nối tcp ngay lập tức trước khi lỗi chứng chỉ được hiển thị.


Sử dụng SNI, về mặt lý thuyết bạn có thể hủy kết nối khi không có chứng chỉ cho tên miền đã cho, điều này vẫn tốt hơn hiển thị lỗi chứng chỉ. Bạn có biết làm thế nào để làm điều này?
Yogu

Có, tôi phát hiện ra rằng có thể return 444hủy kết nối tcp trước khi lỗi cert được hiển thị.
xblax

@xblax Bạn cũng có thể cho chúng tôi CÁCH trả lại 444 trước khi chứng chỉ được hiển thị không? Lý tưởng nhất là tôi sẽ không lãng phí tài nguyên khi bắt tay cho một yêu cầu đến server_name mà tôi không biết. SNI nên tiết lộ tên được yêu cầu trước khi giải mã yêu cầu.
Bão tĩnh

0

Nếu tên miền của bạn là tên miền phụ của cùng một chủ (* .example.com), bạn có thể sử dụng chứng chỉ ký tự đại diện. Không, tôi không nghĩ bạn có thể cung cấp bất kỳ chứng chỉ nào mà trình duyệt sẽ hài lòng.


Xin chào Chris. Tôi đánh giá cao điểm ký tự đại diện nhưng đó không thực sự là những gì tôi đang hỏi. Có, trình duyệt sẽ không thích bất kỳ chứng chỉ nào NHƯNG có cách nào từ chối kết nối dựa trên tên máy chủ được yêu cầu không? (Tôi nghi ngờ là không, nhưng đây có vẻ là nơi để hỏi ... :)
Carlton Gibson

Giả định chưa được kiểm tra -> Bạn sẽ cần cung cấp chứng chỉ hợp lệ hoặc trình duyệt sẽ xem xét kết nối không an toàn. Do đó, trình duyệt sẽ không hành động theo bất kỳ chuyển hướng nào bạn gửi cho đến khi người dùng cho phép ghi đè. Cách duy nhất tôi có thể nghĩ đến để tự động thực hiện ghi đè là cung cấp chứng chỉ hợp lệ. :-(
Chris Nava
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.