Иногда складывается ситуация, когда при разработке сайтов возникает потребность в использовании обоих интернет-протоколов — HTTP и HTTPS - как в случаях требующих повышения уровня защиты сайта в целом, так и для большей защищенности отдельных его страниц. Использование HTTPS уместно, прежде всего, на страницах, содержащих личные данные пользователей, информацию для платежных систем и т.п. Данный протокол предлагает дополнительный слой шифрования/аутентификации между HTTP и TCP, хотя, собственно говоря, HTTPS это не отдельный протокол, а комбинация взаємодействия HTTP и SSL. То есть, SSL это протокол, обеспечивающий конфиденциальность обмена данными между клиентом и сервером, при том что он гарантует умеренную защиту от прослушивания и от нападения типа "человек-посередине" (man-in-the-middle).
Чтобы это реализовать, необходимо настроить веб-сервер и в предлагаемой статье рассматривается пример того, как это выполняется для веб-серверов Nginx и Apache, соответственно. После того как завершена стандартная процедура установки, нужно будет перейти к файлам конфигурации хостов, чтобы указать, где именно использовать протоколы HTTP та HTTPS (по умолчанию - это файлы в папке /etc/nginx/sites-availabe/ ). Кроме этого, понадобятся SSL ключ и сертификаты — их можно либо купить, либо самостоятельно сгенерировать.
Команды терминала для генерирования ключа и сертификата:
openssl genrsa -des3 -out example.key 1024
openssl req -new -key example.key -out example.crt
При генерировании ключа нужно указать в Common name домен, к которому будут задействованы ключи.
Пример конфигурации хоста “drupal7” со смешанным протоколом - HTTP + HTTPS в веб-сервере Nginx (путь к файлу будет, соответственно: /etc/nginx/sites-available/drupal7):
server { ## HTTP protocol port. listen *:80; ## HTTPS protocol port. listen *:443 ssl; server_name example.com www.example.com; ## Server certificate and key. ssl_certificate /etc/nginx/ssl/example.crt; ssl_certificate_key /etc/nginx/ssl/example.key; root /var/www/example.com/htdocs; index index.html index.htm index.php index.cgi index.pl index.xhtml; error_log /var/log/nginx/drupal.error.log; access_log /var/log/nginx/drupal.access.log combined; server_tokens off; client_max_body_size 15M; # host_without_www if ($host ~* www\.(.*)) { set $host_without_www $1; rewrite ^(.*)$ http://$host_without_www$1 permanent; } ## Disable .htaccess and other hidden files location ~ /\. { deny all; access_log off; log_not_found off; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } location ~* ^(?:.+\.(?:htaccess|make|txt|engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(?:\.php)?|xtmpl)|code-style\.pl|/Entries.*|/Repository|/Root|/Tag|/Template)$ { rewrite ^/(.*)$ /index.php?q=$1 last; } ## Factcgi configuration location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_ignore_client_abort off; fastcgi_connect_timeout 60; fastcgi_read_timeout 240; fastcgi_buffer_size 16M; fastcgi_buffers 4 32M; fastcgi_busy_buffers_size 64M; fastcgi_temp_file_write_size 64M; } ## Serve static files directly location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico)$ { access_log off; expires max; } ## Imagecache needs to have php read any files that it's planning to manipulate location ^~ /files/imagecache/ { index index.php; } ## Assume a clean URL is requested, and rewrite to index.php if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?q=$1 last; break; } location ^~ /files/ { allow all; log_not_found off; access_log off; } location ^~ /sites/default/files/ { allow all; log_not_found off; access_log off; } }