Понятно, спасибо. <br>Я тоже предлагал аутентифицировать на фронтэнде, но некоторые категории пользователей (админы, технологи, тестировщики-функциональщики, etc.) зачастую ходят напрямую на backend, вот их-то запросы тоже нужно шифровать и аутентифицировать (не все, а только обращения к приложениям с критичными с точки зрения ИБ данным). Видимо придется вносить акцесс-лист на backend&#39;е, чтобы кроме фронтэнда никто не мог запрашивать, а всех этих товарищей заставлять работать через фронтэнд. Но эта задачка может изрядно затянуться в реализации, это ж нарушение священной мантры &quot;работает - не трогай!&quot;, будет много несогласных. К тому же сопровождение фронтэндов и бакэндов - разные люди в разных отделах, т.е. при каждом изменении тетировщикам придется согласовывать работы еще и на фронтэндах до начала функционального тестирования, что однозначно внесет задержку в и так не быстрый процесс...<br>

Всё же хочу еще раз уточнить - моя задачка не реализуема в принципе или не реализуема средствами nginx? Может кому-то известны программы/железки, которые умеют выполнять такую задачку?<br><br><div class="gmail_quote">5 сентября 2009 г. 17:06 пользователь Igor Sysoev <span dir="ltr">&lt;<a href="mailto:is@rambler-co.ru">is@rambler-co.ru</a>&gt;</span> написал:<br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><div class="h5">On Sat, Sep 05, 2009 at 04:17:32PM +0400, Igor Sysoev wrote:<br>


<br>
&gt; On Sat, Sep 05, 2009 at 01:36:22PM +0400, Бондарец Иван wrote:<br>
&gt;<br>
&gt; &gt; Добрый день!<br>
&gt; &gt; Есть стандартная схема:<br>
&gt; &gt; Интернет -&gt; nginx --&gt; backend (Apache либо WebSphere)<br>
&gt; &gt; nginx сейчас терминирует на себе ssl и проксирует на backend.<br>
&gt; &gt; Возникла задачка аутентифицировать пользователей на некоторых разделах сайта<br>
&gt; &gt; на backend&#39;e при помощи сертификатов. Можно ли настроить nginx на такой<br>
&gt; &gt; режим работы? В моем понимании, на backend&#39;е нужно поднять ssl (с более<br>
&gt; &gt; слабым ключом, например) и настроить авторизацию по сертификатам, это я<br>
&gt; &gt; сделал:<br>
&gt; &gt; SSLEngine on<br>
&gt; &gt; SSLCipherSuite<br>
&gt; &gt; ALL:!ADH:!DH:!EDH:!KRB5:!IDEA:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL<br>
&gt; &gt; SSLCertificateFile /etc/apache2/ssl.crt/apache.crt<br>
&gt; &gt; SSLCertificateKeyFile /etc/apache2/ssl.key/apache.key<br>
&gt; &gt; SSLProtocol +SSLv3 +TLSv1<br>
&gt; &gt; SSLVerifyClient require<br>
&gt; &gt; SSLCACertificateFile /path/to/ca.crt<br>
&gt; &gt;<br>
&gt; &gt;  Далее в конфиге nginx пишу:<br>
&gt; &gt;     server {<br>
&gt; &gt;         listen       443;<br>
&gt; &gt;         server_name  test1;<br>
&gt; &gt;         ssl                  on;<br>
&gt; &gt;         ssl_certificate      /etc/apache2/ssl.crt/apache.crt;<br>
&gt; &gt;         ssl_certificate_key  /etc/apache2/ssl.key/apache.key;<br>
&gt; &gt;<br>
&gt; &gt;         ssl_session_timeout  5m;<br>
&gt; &gt;<br>
&gt; &gt;         ssl_protocols  SSLv2 SSLv3 TLSv1;<br>
&gt; &gt;         ssl_ciphers<br>
&gt; &gt; ALL:!ADH:!DH:!EDH:!KRB5:!IDEA:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL;<br>
&gt; &gt;         ssl_prefer_server_ciphers   on;<br>
&gt; &gt;         location / {<br>
&gt; &gt;         proxy_pass   <a href="https://1.2.3.4:443" target="_blank">https://1.2.3.4:443</a>;<br>
&gt; &gt;             }<br>
&gt; &gt;<br>
&gt; &gt;        }<br>
&gt; &gt;<br>
&gt; &gt; Проверяю аутентификацию при обращении непосредственно к backend&#39;у - на<br>
&gt; &gt; IE6,7,8 и Safari 4.0.2 работает, на FF 3.5.2, Opera 10, Chrome - не<br>
&gt; &gt; работает, пишет что-то вроде этого:<br>
&gt; &gt; SSL-узлу не удалось договориться о приемлемом наборе параметров<br>
&gt; &gt; безопасности.<br>
&gt; &gt; (Код ошибки: ssl_error_handshake_failure_alert)<br>
&gt; &gt;<br>
&gt; &gt; Пробую через nginx, соответственно тоже не работает, в логе nginx пишет:<br>
&gt; &gt; [error] 14221#0: *106 SSL_do_handshake() failed (SSL: error:14094410:SSL<br>
&gt; &gt; routines:SSL3_READ_BYTES:sslv3 alert handshake failure) while SSL<br>
&gt; &gt; handshaking to upstream<br>
&gt; &gt;<br>
&gt; &gt; Как это поправить? И вообще реализуема ли задачка, описанная в начале? Т.е.<br>
&gt; &gt; аутентификация пользователей именно на backend&#39;е?<br>
&gt;<br>
&gt; В таком виде - нет, потому что nginx не передаёт клиентский сертификат<br>
&gt; в proxy_pass.<br>
<br>
</div></div>А кроме того, это технически невозможно, потому что, даже передав<br>
клиентский сертификат, nginx не сможет его подтвердить, не имея<br>
клиентского приватного ключа.<br>
<div><div></div><div class="h5"><br>
&gt; Можно аутентифицировать на nginx&#39;е, а результат проверки<br>
&gt; и прочие ssl-параметры передавать бэкенду без https:<br>
&gt;<br>
&gt;    server {<br>
&gt;       ssl_verify_client   optional;<br>
&gt;<br>
&gt; <a href="http://sysoev.ru/nginx/docs/http/ngx_http_ssl_module.html#ssl_verify_client" target="_blank">http://sysoev.ru/nginx/docs/http/ngx_http_ssl_module.html#ssl_verify_client</a><br>
&gt; <a href="http://sysoev.ru/nginx/docs/http/ngx_http_ssl_module.html#variables" target="_blank">http://sysoev.ru/nginx/docs/http/ngx_http_ssl_module.html#variables</a><br>
<br>
<br>
--<br>
Игорь Сысоев<br>
<a href="http://sysoev.ru" target="_blank">http://sysoev.ru</a><br>
<br>
</div></div></blockquote></div><br>