TYPO3, SSL, nginx, fastcgi. Смешайте все в одно ведро.

TYPO3 нехорошо поступает с Frontend пользователями — хранит пароли в открытом виде в базе данных. Да, есть расширения, позволяющие их шифровать, но их использование влечет за собой траблы с модулями регистрации, логина, бекенда и прочего. Я согласен, что зашивать в ядро шифрование жестко нельзя, но я убежден в том, что такая возможность в ядре должна быть. И должен быть механизм тихой и незаметной работы с паролями для расширений как в режиме шифрования, так и без него. Этот вопрос, насколько я знаю, решается для TYPO3 5.

На данном этапе я принял решение использовать открытые пароли для FE-пользователей в сочетании с SSL для бэкенда и страниц, где приватные данные могут передаваться клиенту. Для этого должны выполняться некоторые технические требования.

1. На уровне nginx должна быть включена поддержка SSL. Включается она параметром --with-http_ssl_module при компиляции. Узнать, есть у вашей сборки nginx поддержка SSL можно так:

$ /usr/sbin/nginx -V

2. Нужно создать и подписать сертификат SSL. Я генерил сертификат на маке, поэтому пользовался соответствующим мануалом. В интернете лежат автоматические генераторы, я их не пробовал.

3. Теперь нужно, чтобы при использовании SSL nginx передавал в fastcgi параметр, указывающий на это. В PHP он доступен по $_SERVER["HTTPS"] = 'on'. Добавляем в конфигурационный файл нужного виртуального хоста копию текущей конфигурации, а в секцию server добавляем информацию для активации SSL.

server {
    listen  443;
    server_name  www.domain.ru;
 
    ssl                  on;
    ssl_certificate      ssl/cert.pem;
    ssl_certificate_key  ssl/webserver.nopass.key;
    ssl_session_timeout  5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;
 
    access_log  /var/www/domain.ru/logs/access.log  main;
    error_log  /var/www/domain.ru/logs/error.log;
 
    location / {
        root   /var/www/domain.ru/htdocs;
        index  index.php index.html index.htm;
        if (!-e $request_filename) {
                rewrite ^(.*)$ /index.php last;
        }
    }
 
    # FCGI
    location ~ \.php$ {
        root           /var/www/domain.ru/htdocs;
        fastcgi_pass_request_body off;
        client_body_in_file_only clean;
        client_body_temp_path /dev/shm/client_body_temp;
        fastcgi_param  REQUEST_BODY_FILE  $request_body_file;
        fastcgi_pass   unix:/tmp/php.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/domain.ru/htdocs$fastcgi_script_name;
        include        fastcgi_params;
        fastcgi_param  HTTPS    on;
    }
 
    location ~ /\.ht {
        deny  all;
    }
}

4. Теперь нам нужно научить TYPO3 переключаться в режим защищенного соединения. Для бэкенда это делается параметром $TYPO3_CONF_VARS['BE']['lockSSL'] = '2';, который говорит Тайпе, что в бекенд нужно пускать только по SSL, и редиректить если был запрос без него.

SSL

Теперь это выглядит как-то вот так примерно

5. Для фронтенда я воспользовался расширением https. В редакторе констант нужно подправить название домена сайта и все. После установки на нужных страницах галочки “только SSL” будут передаваться только по защищенному каналу.

UPD

Я посмотрел один автогенератор сертификатов на Руби. Он не генерирует беспарольный ключ для старта сервера, а в остальном вроде нормально работает.

Posted Четверг, Октябрь 22nd, 2009 under General.

One comment so far

  1. Сертификаты удобно создавать на сервере нативно через OpenSSL. Все есть в комплекте.

    Например так: http://www.impetus.us/~rjmooney/projects/misc/clientcertauth.html

Leave a Reply

Spam protection by WP Captcha-Free