Як відключити TLS 1.1 та 1.2 в Apache?


13

У мене є сервер Ubuntu 12.04.2 LTS під керуванням Apache 2.2.22 з mod_ssl та OpenSSL v1.0.1.

У моєму конфігурації vhosts (усе інше, в якому він веде себе так, як я очікував), я маю SSLProtocolвідповідність -all +SSLv3.

З цією конфігурацією TLS 1.1 та 1.2 увімкнено і працюють правильно - що для мене є протиінтуїтивним, оскільки я б очікував, що тільки SSLv3 буде включений з огляду на цю конфігурацію.

Я можу включити / відключити TLSv1 просто чудово -/+TSLv1, і він працює як очікувалося. Але +/-TLSv1.1і +/-TLSv1.2не є допустимими параметрами конфігурації - так що я не можу відключити їх таким чином.

Щодо того, чому я хотів би це зробити - я маю справу з стороннім додатком (над яким я не маю контролю), який має певну помилку з серверами, що підтримуються TLS, і мені потрібно повністю відключити його, щоб рухатись вперед.


просто з цікавості - я можу запитати, чому ви хочете відключити TSL в першу чергу? з того, що я зібрав, він повинен бути більш безпечним, ніж SSLv1 / 2/3, тому я можу лише уявити причини, щоб хотіти дозволяти лише v1.2, а не v1.1 (саме це мене привело сюди), але не для його відключення на користь SSL, за винятком можливо деяких проблем сумісності зі старшим програмним забезпеченням?
кодування

@codeling Робота зі старим, стороннім програмним забезпеченням, яке має помилки з TLS.
Кайл Лоурі

Відповіді:


23

Заінтригований цією помилкою (і так, мені вдалося її відтворити) Я переглянув вихідний код останньої стабільної версії mod_sslта знайшов пояснення. Візьміть із собою, це отримає аматорське переповнення:

Коли SSLProtocolсинтаксичний розбір, це призводить до charвигляду приблизно такого:

0 1 0 0
^ ^ ^ ^
| | | SSLv1
| | SSLv2
| SSLv3
TLSv1

Після ініціювання нового контексту сервера будуть включені ВСІ доступні протоколи, а вищезазначене charперевіряється за допомогою деяких чудових побітових операцій І для визначення того, які протоколи слід відключити . У цьому випадку, коли SSLv3 є єдиним протоколом, який був явно увімкнутий, 3 інші будуть відключені.

OpenSSL підтримує налаштування протоколу для TLSv1.1, але оскільки SSLProtocolцей параметр не враховує, він ніколи не відключається. OpenSSL v1.0.1 має деякі відомі проблеми з TLSv1.2, але якщо він підтримується, я припускаю, що це стосується і TLSv1.1; вона не розпізнається / не обробляється mod_ssl і тому ніколи не відключається.

Посилання на вихідний код для mod_ssl:

SSLProtocolотримує розібраний на лінії 925 в pkg.sslmod/ssl_engine_config.c
Використаний в функції вище опцій визначається в рядку 444 в pkg.sslmod/mod_ssl.h
усіх протоколів отримує включений в рядку 586 в pkg.sslmod/ssl_engine_init.cчого конкретні протоколи отримує інвалідів на наступних рядках

Як відключити його тоді?

У вас є кілька варіантів:

  1. Вимкніть його у конфігураційному файлі OpenSSL за допомогою:
    Protocols All,-TLSv1.1,-TLSv1.2
  2. Перепишіть mod_ssl;-)

Виглядає як ідеальна відповідь, просто потрібно перевірити: який / що / де конфігураційний файл OpenSSL?
Кайл Лоурі

openssl.cnf- розташування залежить від встановлення. На Debian видавленні я виявив це в /etc/ssl/openssl.cnf, в OS X в /System/Library/OpenSSL/openssl.cnfі в Windows 7 на %systemdrive%\openssl\openssl.cnf.
Mathias R. Jessen

1
Я зараз дивлюся на конфігураційний файл; синтаксис виглядає дещо інакше, ніж я б очікував, виходячи з вашої відповіді, і я, здається, не можу знайти нічого в Інтернеті, що прямо говорить про те, що ви можете керувати протоколами, які ввімкнено / вимкнено з цього конфігураційного файлу. Чи є у вас якісь посилання на це? Дякую.
Кайл Лоурі

Інший варіант - використовувати: SSLProtocolтаким же чином вище ( SSLProtocol All -TLSv1.1 -TLSv1.2(жодні коми не потрібні)), але під глобальним або конкретним конфігурацією Apache, щоб "перекрити" будь-яку конфігурацію SSL, згадану вище. (Якщо ви не хочете змінювати всі основні шифри SSL -> Оскільки шифр, який вам потрібно, вважається слабким.)
bshea

2

Проблему також вирішують у коментарях на сторінці mod_ssl Apache: http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#comment_1136

Якби Ubuntu 12.04 мав Apache 2.2.23, проблема б не сталася. Відповідно до коментарів, можна включити TLSv1.1 і TLSv1.2, але TLSv1.0 також увімкнено:

SSLProtocol All -SSLv2 -SSLv3

1

Перш за все, ви повинні визначити, що є vhost за замовчуванням для порту 443 на вашому сервері (перший SSL vhost, завантажений Apache), і відредагувати його файл конфігурації. Більшість користувачів мають на своїх серверах файл ssl.conf, там налаштований vhost для порту 443. Оскільки ім'я цього файлу починається з "s", він завантажиться перед vhosts, налаштованими в vhosts.conf (який починається з "v"). Отже, перевірте, чи це у вашому випадку (відповідь "так" практично для всіх) та змініть протоколи у цьому файлі . Цього достатньо!

Аналогічна проблема була розміщена тут: Як відключити TLS 1.1 та 1.2 в Apache? . За даними HBruijn:

Якщо у вас немає IP VirtualHosts, на практиці параметри від першого появи директиви SSLProtocol використовуються для всього сервера та / або всіх заснованих на іменах VirtualHosts, що підтримують TLS

І інше тут: Чи можна встановити SSLProtocol в Apache для одного VirtualHost (пудель)? . За даними vallismortis:

Ви можете встановити SSLProtocol лише для першого VirtualHost у файлі конфігурації. Усі наступні записи VirtualHost успадкують це налаштування з першого запису і мовчки ігнорують їх власні налаштування через помилку OpenSSL.

До речі: vhost за замовчуванням на сервері для даного порту - це той, хто відповідає на запити цього порту, які надходять на сервер без ідентифікації імені сервера (або з неправильним іменем сервера). Приклад: IP-адреса, введена в адресному рядку вашого браузера, або помилкове переспрямування, викликане неправильною таблицею DNS.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.