Как лучше всего узнать, где мои протоколы SSL могут быть переопределены на сервере CentOS 7? Apache 2.4.6 (понимая, что он тоже довольно старый, поэтому мне придется обновить его в нерабочее время и посмотреть, решит ли он проблему).
Я пытаюсь отключить TLSv1 с помощью этой директивы Apache в моем корне конфигурации (/etc/httpd/conf/httpd.conf)
SSLProtocol -all +TLSv1.1 +TLSv1.2
Но когда я бегу nmap --script ssl-enum-ciphers -p 443 <mysite.com>
Это показывает, что TLSv1 все еще включен:
ssl-enum-ciphers:
| TLSv1.0:
| ciphers:
| TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
| TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
| compressors:
| NULL
| cipher preference: server
В Тест SSL Labs показывает то же самое.
Нет другого SSLProtocol
директивы предоставляются на виртуальном хосте.
После этого я решил просто поискать все файлы конфигурации с помощью этой команды sudo grep -rnw '/etc/httpd' -e 'SSLProtocol'
и он показал следующие места:
/etc/httpd/conf/httpd.conf:359:SSLProtocol -all +TLSv1.1 +TLSv1.2
/etc/httpd/conf.d/ssl.conf:74:SSLProtocol ALL -SSLv2 -SSLv3
/etc/httpd/conf.d/ssl.conf:227:SSLProtocol ALL -SSLv2 -SSLv3
/etc/httpd/conf.d/ssl.conf:257:SSLProtocol ALL -SSLv2 -SSLv3
/etc/httpd/conf.d/ssl.conf.rpmnew:75:SSLProtocol all -SSLv2 -SSLv3
Итак, я зашел в файл ssl.conf и изменил строку 74, чтобы она соответствовала, проблема все еще сохраняется. Строки 227 и 257 предназначены для двух виртуальных хостов, которые я в настоящее время не тестирую, но обновлю позже.
РЕДАКТИРОВАТЬ: несмотря на то, что оставшиеся две строки были для виртуальных хостов, предоставили ответы об ошибке OpenSSL, я изменил все ссылки на SSLProtocol -all +TLSv1.1 +TLSv1.2
и перезапустил мой сервер, но ничего не изменилось. Почему это могло быть? Мне интересно, не ошибка ли это в самом Apache 2.4.6.
Мне удалось решить эту проблему, и это определенно было неожиданное исправление. На мой взгляд, тот факт, что виртуальные хосты наследуют настройки своих братьев и сестер, является плохим решением. Тем более, что глобальные настройки файлов не имеют приоритета. я нашел Эта проблема на Bugzilla и проходил через это, когда позже кто-то упомянул, что Let's Encrypt имеет изолированный файл /etc/letsencrypt/options-ssl-apache.conf
в этом файле есть настройка:
SSLProtocol all -SSLv2 -SSLv3
Certbot автоматически устанавливает ссылку на этот файл в конфигурации виртуального хоста, и этот сертификат был установлен на первом виртуальном хосте в моей конфигурации сервера. Я изменил его, чтобы он соответствовал моей предыдущей настройке SSLProtocol -all +TLSv1.1 +TLSv1.2
и это сработало отлично.
С помощью
SSLProtocol TLSv1.2
Или
SSLProtocol -ALL +TLSv1.2
Должно сработать. Но (всегда есть но!) Он не работает, настраивая его в виртуальных хостах. Используя виртуальные хосты, он сохраняет первый вариант виртуального хоста для всех последующих виртуальных хостов.
По крайней мере, это происходит в CentOS 7.6 с Apache (httpd) 2.4.6.
Если у вас есть несколько виртуальных хостов TLS и вы используете указание имени сервера (SNI), разрешенным синтаксисом является наличие SSLProtocol
директива для каждого VirtualHost, но если у вас нет IP VirtualHosts на практике, настройки для SSLProtocol
директивы из первого VirtualHost используются для всего сервера и / или все VirtualHosts на основе имен с поддержкой TLS1.
Удалять (или закомментировать) каждые SSLProtocol ALL -SSLv2 -SSLv3
линии и измените их на свой SSLProtocol TLSv1.1 TLSv1.2
. Только отключение этих двух по-прежнему позволит TLSv1.0.
Не нужно указывать -all, если вы включаете только то, что вам нужно.