Иногда складывается ситуация, когда при разработке сайтов возникает потребность в использовании обоих интернет-протоколов — 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;
}
}
