[Полноценный сервер — Часть4] — настройка виртуальных хостов с поддержкой ssl (https)

Продолжаем танцы с бубном!… а точнее говоря настройку нашей жестяной банки, которую иногда называют сервером… Теперь нам необходимо, чтобы определенный адрес работал в зашифрованном соединении, а точнее например нужно что бы адрес https://site.ru у нас открывался … Представим, что у нас уже настроен web сервер по описанию, которое я писал тут: http://maxidrom.net/archives/446 … Если это так то приступим …

Для начала нам необходимо поставить пакеты openssl openssl-blacklist ssl-cert:

sudo aptitude install openssl openssl-blacklist ssl-cert

Далее создадим приватный ключ (private key) …

adm@srv:~$ openssl genrsa -des3 -out site.ru.key 2048
Generating RSA private key, 2048 bit long modulus
..................................................+++
.................................................................................+++
unable to write 'random state'
e is 65537 (0x10001)
Enter pass phrase for site.ru.key:
Verifying - Enter pass phrase for site.ru.key:

При создании ключа необходимо будет придумать пароль …

Теперь мы можем создать самоподписанный сертификат (CSR — Certificate Signing Reques) …

~$ openssl req -new -key site.ru.key -out site.ru.csr
Enter pass phrase for site.ru.key:
8085:error:28069065:lib(40):UI_set_result:result too small:ui_lib.c:850:You must type in 4 to 8191 characters
Enter pass phrase for site.ru.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Russia
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:site.ru
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:site.ru
Email Address []:ssl@site.ru

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Есть небольшой косяк использования ключа с паролем … при загрузке apache и nginx они просят постоянно просят пароль … если для вас это не есть круто, то делаем так:

~$ cp site.ru.key site.ru.original
~$ openssl rsa -in site.ru.original -out site.ru.key
Enter pass phrase for site.ru.original:
writing RSA key

Вот … теперь создадим сам сертификат:

~$ openssl x509 -req -days 365 -in site.ru.csr -signkey site.ru.key -out site.ru.crt
Signature ok
subject=/C=RU/ST=Russia/O=site.ru/CN=site.ru/emailAddress=ssl@site.ru
Getting Private key
unable to write 'random state'

Отлично! Пляски с ssl завершаем … у нас есть все что нужно для создания ssl соединения … Теперь раскидаем файлы по нужным папкам, а точнее сам сертификат:

~$ sudo cp site.ru.crt /etc/ssl/certs/

… и ключ:

 ~$ sudo cp site.ru.key /etc/ssl/private/

А то что осталось можете удалить … Теперь приступим к шаманству с nginx … вспомним хост nginx для нашего site.ru — немного доделаем его:

# p.b.leo
# 22.03.11
# Хост для www.site.ru
server {
listen 80;
server_name     site.ru www.site.ru srv.site.ru;
access_log      /home/site.ru/www.site.ru/logs/nginx.access-site.ru.log;
error_log       /home/site.ru/www.site.ru/logs/nginx.error-site.ru.log;

location / {
proxy_pass      http://127.0.0.1:81/;
include         /etc/nginx/proxy.conf;
}

location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|xml|docx|xlsx|js)$ {
root            /home/site.ru/www.site.ru/www/htdocs;
}
}
server {
listen   443;
server_name site.ru www.site.ru srv.site.ru;
ssl    on;
ssl_certificate         /etc/ssl/certs/site.ru.crt;
ssl_certificate_key     /etc/ssl/private/site.key;
access_log      /home/site.ru/www.site.ru/logs/nginx-ssl.access-site.ru.log;
error_log       /home/site.ru/www.site.ru/logs/nginx-ssl.error-site.ru.log;

location / {
proxy_pass  http://127.0.0.1:82/;
include     /etc/nginx/proxy.conf;
}

location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|xml|docx|xlsx|js)$ {
root            /home/site.ru/www.site.ru/ssl/htdocs;
}
}

Таким образом наш сайт будет бегать через nginx по ssl, а данные ему будет передавать apache … не забываем включить хост и перезапустить nginx…

~$ sudo /etc/init.d/nginx restart

Создадим файл для проверки и напишем там например «SSL — WORK!»:

sudo vim /home/site.ru/www.site.ru/ssl/htdocs/index.html

Далее необходимо будет натроить Apache. Первое что мы откроем это файл ports.conf

~$ sudo vim /etc/apache2/ports.conf

и добавим туда следующие строки:

# ssl
Listen 82

Далее создаем файл site.ru-ssl:

~$ sudo vim /etc/apache2/sites-available/tvir.ru-ssl

И вписываем туда следующее содержимое:

<VirtualHost *:82>
ServerAdmin webmaster@site.ru
ServerName site.ru
ServerAlias www.site.ru
ServerAlias srv.site.ru
DocumentRoot /home/site.ru/www.site.ru/ssl/htdocs

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>

<Directory /home/site.ru/www.site.ru/ssl/htdocs/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /home/site.ru/www.site.ru/ssl/cgi-bin/
<Directory "/home/site.ru/www.site.ru/ssl/cgi-bin/">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /home/site.ru/www.site.ru/logs/site.ru-ssl-error.log
# Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
LogLevel warn
CustomLog /home/site.ru/www.site.ru/logs/site.ru-ssl-access.log combined
<IfModule mpm_itk_module>
AssignUserId site.ru users
</IfModule>
</VirtualHost>

Теперь включаем данный хост:

~$ sudo a2ensite tvir.ru-ssl

Проверяем, не напортачили ли мы с портами… должно быть так:
80 порт слушает nginx,
443 порт слушает nginx,
81 порт слушает Apache,
82 порт слушает Apache.

~$ sudo netstat -eelnpA inet | sort -nk4 | egrep "^[A-Z]|:80"
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp   0      0      0.0.0.0:443   0.0.0.0:*       LISTEN  0     1346394 10993/nginx
tcp   0      0      0.0.0.0:80    0.0.0.0:*       LISTEN  0     1346393 10993/nginx
tcp   0      0      0.0.0.0:81    0.0.0.0:*       LISTEN  0     1347538 11391/apache2
tcp   0      0      0.0.0.0:82    0.0.0.0:*       LISTEN  0     1347540 11391/apache2

Перезагружаем Apache:

sudo /etc/init.d/apache2 restart

Проверить все это теперь можно зайдя на адрес https://site.ru … если вы все правильно сделали, то вы увидите надпись «SSL-WORK». Кстати браузер может выдать вам предупреждение о том что сертификат не действителен, и это нормально, так как используется самоподписанный сертификат, если вы зайдете по адресу https://srv.site.ru, то он выдаст еще одно предупреждение, так как домен не совпадает со значением «Common Name». В любом случае, при использовании коммерческого сертификата предупреждений не будет.

Enjoy!!!!!!

———————————————————-

Материалы, которые я использовал:

http://debianworld.ru/articles/ustanovka-nginx-apache-i-nastrojka-virtualnyh-hostov-c-podderzhkoj-ssl-https-v-debian-ubuntu/
http://ru.wikipedia.org/wiki/SSL
http://www.opennet.ru/base/sec/apache_ssl_certification.txt.html