Я пытаюсь включить прямую секретность в CentOS с помощью веб-сервера nginx.
Что я пробовал
Я прочитал несколько руководств и, похоже, у нас должны быть последние версии nginx, openssl, чтобы включить его. Итак, я установил последнюю версию openssl из исходников.
sudo wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz
sudo tar -xvzf openssl-1.0.1e.tar.gz
cd openssl-1.0.1e
sudo ./config --prefix=/usr/local
sudo make
sudo make install
Теперь OpenSSL поддерживает шифры Eliptic Curve (ECDHE). Я также тестировал это с помощью openssl s_server. Это сработало.
Затем я заменил Nginx на последнюю версию.
sudo wget http://nginx.org/packages/centos/6/x86_64/RPMS/nginx-1.4.2-1.el6.ngx.x86_64.rpm
sudo rpm -e nginx
sudo rpm -ivh nginx-1.4.2-1.el6.ngx.x86_64.rpm
и настроил Nginx, как описано в этой ссылке
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+RC4:EDH+aRSA:EECDH:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
http://baudehlo.wordpress.com/2013/06/24/setting-up-perfect-forward-secrecy-for-nginx-or-stud/
Но теперь Nginx не поддерживает шифры ECDHE. Он поддерживает шифры DHE. Я пробовал, просто включив шифр ECDHE в nginx, все еще не работает. Я использую последнюю версию веб-браузера (Chrome 29, и он поддерживает этот шифр)
Я что-нибудь упускаю? Или возникли проблемы с CentOS или Nginx? Я где-то читал, что проблема с патентом ECC в CentOS, это проблема?
Вы правы, что ECC в RedHat (и, следовательно, в CentOS) openssl
отключен из-за проблем с патентами; см. (например) эта запись bugzilla Больше подробностей. Обратите внимание, что каждый раз, когда кто-либо открывает новый трекер для сравнения, он закрывается как копия этого, поэтому не дайте себя обмануть возрасту трекера, думая, что это уже устраненная проблема (примечание: хотя большая часть этой bugzilla является плохие новости, мне понравился комментарий RH 'Обратите внимание: «Ubuntu делает это» никогда не является жизнеспособным юридическим аргументом.').
Вы правильно догадались, что для обхода потребуется составить собственный openssl
, и это хорошо. Но, сделав это, вы не можете просто установить упакованные двоичные файлы и ожидать, что они волшебным образом подберут ваши новые библиотеки, потому что они этого не сделают.
Вам нужно будет перекомпилировать openssl, например, --prefix=/usr/local/openssl-custom
, затем make install
его в это новое место, затем скомпилируйте nginx
из источника, заботясь о том, чтобы он скомпилировал и скомпилировал новые библиотеки (я не могу дать вам стандартное заклинание для этого, потому что оно варьируется от пакета к пакету, но -with-ssl=/usr/local/openssl-custom
иногда может быть правильным).
Если вам нужны другие инструменты для работы nginx
, и любой из них openssl
зависимости (а в наши дни, что нет?), вам, вероятно, также придется скомпилировать их.
Пожалуйста, позвольте мне в конце отговорить вас от этого. Это много работы; компиляция является наименьшей из них, тогда вы должны оставаться в курсе всех новых выпусков пакетов, которые вы создали, и перестраивать их при каждом изменении. Я не знаю, почему вы решили, что вам нужна прямая секретность, но я сильно подозреваю, что вы вызовете больше проблем с безопасностью из-за того, что пакеты выходят из исправления, чем вы когда-либо исправите, включив его.
Обратите внимание также на комментарии 43 и 90 в записи bugzilla, указанной выше; если под прямой секретностью вы имеете в виду Perfect Forward Secrecy (PFS), то включение PFS не похоже, требуется наличие ECC. Или просто подожди, так как похоже, что мы получаем ECC начиная с RHEL6.5 (C6.5).
я использую
yum --enablerepo=axivo install nginx
и
yum --enablerepo=axivo update openssl
Инструкции для Nginx Вот и для OpenSSL Вот.
Это устанавливает (на момент этого ответа) Nginx 1.4.4 и OpenSSL 1.0.1e
Apache (httpd) дал мне проблемы, и мне пришлось перекомпилировать, но в остальном все в порядке с этой настройкой.
Я также потратил много времени на улучшение этого предпочтения шифра (для меня) - вдохновленный Google:
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:RC4-SHA:RC4-MD5:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:ECDHE-RSA-AES128-SHA:AES128-SHA256:AES128-SHA;
Используйте его на свой страх и риск.
Вы можете использовать ssllabs.com для тестирования.
как tl; dr за то, что предложил MadHatter:
есть возможность запустить nginx с современным ssl, если ваш openssl немного устарел:
настройте nginx для использования ваших загруженных openssl-источников:
./configure ... --with-openssl=/path/to/openssl_source/ ...
тогда у вас будет обновленный nginx с современным ssl, построенный статически и без вмешательства в ваш openssl-пакет из вашего дистрибутива.
для получения дополнительной информации о nginx + ssl см. это руководство по nginx и ssl