[Полноценный сервер — Часть4] — настройка виртуальных хостов с поддержкой ssl (https)
Продолжаем танцы с бубном!… а точнее говоря настройку нашей жестяной банки, которую иногда называют сервером… Теперь нам необходимо, чтобы определенный адрес работал в зашифрованном соединении, а точнее например нужно что бы адрес https://site.ru у нас открывался … Представим, что у нас уже настроен web сервер по описанию, которое я писал тут: https://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 []:[email protected] 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/[email protected] 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 [email protected] 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