Có thể đặt SSLProtocol trong Apache cho một Virtualhost (poodle) không?


13

Tôi đang cố gắng kiểm tra một bản vá cho lỗ hổng poodle liên quan đến việc vô hiệu hóa SSLv3 trên máy chủ web của tôi. Để thử nghiệm điều này trên môi trường phi sản xuất trước tiên, tôi đang đặt SSLProtocol trên Virtualhost cho một máy chủ thử nghiệm khác. Cấu hình của tôi trông giống như thế này:

<VirtualHost *:443>
    SSLEngine On
    SSLProtocol All -SSLv2 -SSLv3
    ServerName test.mysite.com
    # bunch of other stuff omitted
</VirtualHost>

Tuy nhiên ngay cả sau khi khởi động lại apache, trang web thử nghiệm của tôi vẫn được cho là dễ bị tấn công. Đây có phải là dự kiến ​​để làm việc? Tôi tự hỏi nếu tôi phải đặt nó trong cấu hình ssl toàn cầu hoặc liệu có thứ gì khác tinh tế khiến cho cài đặt không thực hiện và / hoặc hoạt động.

Câu trả lời:


16

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 SSLProtocolcho máy chủ mặc định của bạn.


Các thông tin bổ sung được thêm bởi @anx liên quan đến SSLStrictSNIVHostChecknhiề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 .
vallismortis

5

Bạn có thể có các giao thức SSL khác nhau cho mỗi Vhost nếu chúng đang nghe trên một IP khác nhau.

Ví dụ với một máy chủ cụ thể cho phép TLSv1 và tất cả các máy chủ khác chỉ cho phép TLSv1.1 và TLSv1.2 - và một máy chủ chỉ cho phép TLSv1.2:

<VirtualHost *:443>
  SSLEngine On
  SSLProtocol All -SSLv2 -SSLv3 -TLSv1
  ServerName test.mysite.com
  # bunch of other stuff omitted
</VirtualHost>

<VirtualHost 10.0.0.2:443>
  SSLEngine On
  SSLProtocol All -SSLv2 -SSLv3
  ServerName test2.mysite.com
</VirtualHost>

<VirtualHost 10.0.0.3:443>
  SSLEngine On
  SSLProtocol TLSv1.2
  ServerName test2.mysite.com
</VirtualHost>

Ngoài ra, nếu bạn chỉ cần nó cho mục đích thử nghiệm, bạn có thể sử dụng một cổng khác thay vì IP khác, ví dụ như cổng HTTPS thay thế phổ biến 8443.
Esa Jokinen

0

Nếu bạn đang sử dụng Chỉ định tên máy chủ (SNI) với vhost của mình, thực tế, bạn không thể xác định nhiều phiên bản SSL.

Tuy nhiên, nếu bạn đang sử dụng một máy chủ chuyên dụng, có lẽ bạn có thể thêm một địa chỉ IP khác vào máy chủ của mình. Bằng cách này, bạn sẽ có thể sử dụng phiên bản SSL khác nhau cho mỗi IP. Bạn chỉ cần thay đổi cài đặt vhost của mình như IP dự kiến: 443.


-2

Hoặc bạn có thể sử dụng:

SSLProtatio TLSv1 TLSv1.1 TLSv1.2

Tôi đã được thử nghiệm trên nhiều máy chủ và làm việc cho tôi! Bạn có thể kiểm tra trang web của bạn trong trang web này


4
Dòng SSLProtocol này chỉ trông giống như nó đang hoạt động vì Apache không phàn nàn về nó. Trong thực tế, chỉ SSLProtocol trong mục Virtualhost đầu tiên được sử dụng.
vallismortis
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.