Назад | Перейти на главную страницу

Прямая секретность в Nginx (CentOS6)

Я пытаюсь включить прямую секретность в 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 немного устарел:

  • скачивать и извлекать исходники из openssl
  • настройте nginx для использования ваших загруженных openssl-источников:

    ./configure ... --with-openssl=/path/to/openssl_source/ ... 
    
  • собери свои пакеты

тогда у вас будет обновленный nginx с современным ssl, построенный статически и без вмешательства в ваш openssl-пакет из вашего дистрибутива.

для получения дополнительной информации о nginx + ssl см. это руководство по nginx и ssl