Bạn chỉ có thể đặt SSLProtocol cho Virtualhost đầu tiên trong tệp cấu hình. Tất cả các mục Virtualhost tiếp theo sẽ kế thừa cài đặt đó từ mục nhập đầu tiên và âm thầm bỏ qua cài đặt riêng của chúng do lỗi OpenSSL .
Có một báo cáo lỗi tương ứng cho mod_ssl , nhưng như được mô tả trong báo cáo lỗi, vấn đề cần được giải quyết trong OpenSSL (chứng chỉ được kế thừa nhưng không phải là giao thức).
Các bộ mật mã phải được đặt độc lập cho mỗi Virtualhost, nếu không, bạn sẽ kết thúc với danh sách mặc định, bao gồm rất nhiều mật mã không an toàn. Ngoài ra, hãy lưu ý rằng các máy khách cũ không hỗ trợ Chỉ định Tên Máy chủ (SNI) sẽ luôn sử dụng máy chủ mặc định (trừ khi bị chặn sử dụngSSLStrictSNIVHostCheck
), điều này có thể gây khó khăn cho việc kiểm tra của bạn.
Nói tóm lại, bạn sẽ có thể chỉ định các bộ mật mã và chứng chỉ tùy chỉnh cho từng máy chủ ảo, nhưng cho đến khi lỗi được khắc phục, đừng mong đợi hành vi đúng với các giao thức tùy chỉnh cho từng máy chủ ảo.
Tôi đã gặp vấn đề này với Apache 2.4 và modssl với OpenSSL 1.0.1k và tôi hy vọng rằng Apache 2.2 sẽ phải chịu các vấn đề tương tự.
Cập nhật (tháng 10 năm 2016): Lỗi OpenSSL đã được đánh dấu là đã được giải quyết vào ngày 13 tháng 10 năm 2016. Tuy nhiên, đây là một phần của việc đóng cửa hàng loạt các vấn đề mở và mặc dù đã có một 'sửa chữa một phần', nhưng vấn đề không bao giờ được giải quyết đầy đủ.
Cập nhật (tháng 4 năm 2018): Lỗi OpenSSL được gửi lại hiện đã có bản vá (kể từ ngày 9 tháng 4 năm 2018). Bản vá này sẽ thay đổi hành vi của các phiên bản Apache được cấu hình với nhiều máy chủ ảo SNI:
Từ chối các kết nối không tuân thủ vhost SSLProtocol
Điều này đã được phát triển và thử nghiệm với 2.4.27 và trong sản xuất với phiên bản đó. Các bản vá đã được sửa đổi cho 2.4.33 và thử nghiệm nhẹ.
Cái này kiểm tra phiên bản của kết nối với SSLProtocol được cấu hình cho máy chủ ảo được khớp dựa trên SNI. Do kết nối ban đầu được thực hiện với SSLProtocol được định cấu hình cho máy chủ mặc định cho cổng, nên máy chủ mặc định phải bao gồm tất cả các giao thức sẽ được hỗ trợ bởi bất kỳ máy chủ ảo nào.
Bản vá này bổ sung trạng thái trả về bổ sung của APR_EMISMATCH cho chức năng init_vhost để cuộc gọi lại ssl_callback_ServerNameIncom đã đăng ký với OpenSSL có thể trả về cảnh báo nguy hiểm SSL_AD_PROTOCOL_VERSION. Điều này nhằm tạo ra phản hồi tương tự với ClientHello khi có SSLProtocol được chỉ định không bao gồm phiên bản được đề cập. Vì cuộc gọi lại SNI được gọi trong quá trình xử lý ClientHello và trước khi phản hồi được tạo ra, nó dường như thực hiện chính xác điều đó.
Nếu bạn đột nhiên thấy các tin nhắn có định dạng sau:
Rejecting version [version] for servername [hostname]
Sau đó, bạn nên kiểm tra lại SSLProtocol
cho máy chủ mặc định của bạn.
SSLStrictSNIVHostCheck
nhiều đánh giá cao. Tuy nhiên, nó cũng cần lưu ý từ các tài liệu được trích dẫn rằng Nếu thiết lập để vào trong bất kỳ máy chủ ảo khác, SNI khách hàng không biết không được phép truy cập vào máy chủ ảo đặc biệt này .