Установка нескольких SSL-сертификатов на один IP с помощью Apache на Ubuntu 12.04

Published by 1 Comment

Протокол Server Name Identification (SNI) позволяет размещать несколько SSL-сертификатов на один IP-адрес.

Что такое SNI?

Благодаря виртуальным хостам размещение нескольких сайтов на одном VPS — не проблема; тем не менее, для создания отдельных SSL-сертификатов таких сайтов по-прежнему необходимы отдельные IP-адреса. Недавно этот процесс был упрощен за счет использования протокола Server Name Indication (или SNI), который посылает посетителю сайта сертификат, соответствующий запрашиваемому имени сервера.

Примечание: протокол SNI может быть использован только для обслуживания нескольких SSL-сертификатов, и, вероятно, не будет работать с другими демонами, почтовыми серверами и т.д. Кроме того, некоторые устаревшие веб-браузеры могут выдавать ошибки сертификата. Обновленный список программного обеспечения, которое поддерживает и не поддерживает это расширение TLS, можно найти в  Википедии.

Требования

Для обслуживания сертификатов SNI не требует зарегистрированных доменных имен.

Для выполнения руководства необходима учетная запись с привилегиями root. Чтобы узнать, как получить эти привилегии, читайте руководство по начальной настройке сервера.

Кроме того, на VPS должен быть установлен Apache. В противном случае используйте команду, которая установит Apache:

sudo apt-get install apache2

1: Создание SSL-сертификатов

В рамках данного руководства оба сертификата будут самоподписанными. Нужно создать сервер для размещения сайтов example.com и example.org.

По сути, SSL-сертификат состоит из двух частей: самого сертификата и открытого ключа. Чтобы получить доступ ко всем необходимым файлам было легко, нужно создать каталог для SSL-сертификата каждого виртуального хоста.

mkdir -p /etc/apache2/ssl/example.com
mkdir -p /etc/apache2/ssl/example.org

2: Активация модуля SSL

Далее нужно активировать SSL на сервере.

sudo a2enmod ssl

Затем перезапустите Apache.

sudo service apache2 restart

3: Создание самоподписанного SSL-сертификата

Запрашивая сертификат, можно указать срок его действия; для этого нужно изменить значение 365 необходимым количеством дней. Созданный по следующему примеру сертификат будет действителен в течение года.

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/example.com/apache.key –out /etc/apache2/ssl/example.com/apache.crt

Данная команда создает сам сертификат, а также защищающий его ключ, после чего помещает их в новый каталог.

Кроме того, данная команда выводит на экран список полей, которые нужно заполнить.

Самым важным полем является «Common Name». Введите официальное доменное имя или IP-адрес сайта, если такого имени еще нет.

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]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:NYC
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Awesome Inc
Organizational Unit Name (eg, section) []:Dept of Merriment
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:webmaster@awesomeinc.com

Затем выполните те же действия, чтобы создать сертификат для второго домена (example.org):

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/example.org/apache.key -out /etc/apache2/ssl/example.org/apache.crt

4: Создание виртуальных хостов

Теперь, когда оба сертификата готовы, можно заполнить файлы виртуальных хостов необходимой информацией.

Это необязательно, но данное руководство рекомендует хранить виртуальные хосты в отдельных файлах, потому нужно создать два файла для виртуальных хостов.

sudo nano /etc/apache2/sites-available/example.com
sudo nano /etc/apache2/sites-available/example.org

Затем нужно внести в каждый файл приведенные ниже конфигурации, которые представляют собой упрощенную версию двух конфигурационных файлов: конфигурационного файла виртуального сервера по умолчанию (/etc/apache2/sites-available/default) и конфигураций SSL по умолчанию (/etc/apache2/sites-available/default-ssl).

Кроме того, данные конфигурации содержат важные поправки, позволяющие установить несколько сертификатов SSL. В то время как конфигурация SSL по умолчанию имеет следующую строку, задающую сертификат сервера по умолчанию:

<VirtualHost _default_:443>

приведенный ниже код не ссылается на такой сертификат.

В целом, конфигурационные файлы по умолчанию предлагают множество полезных каталогов и дополнительных опций, которые можно добавить на виртуальный хост. Тем не менее, следующий код будет предоставлять серверу все необходимое для создания нескольких SSL-сертификатов на одном IP-адресе.

<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName example.com
DocumentRoot /var/www
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName example.com
DocumentRoot /var/www
#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on
#   A self-signed (snakeoil) certificate can be created by installing
#   the ssl-cert package. See
#   /usr/share/doc/apache2.2-common/README.Debian.gz for more info.
#   If both key and certificate are stored in the same file, only the
#   SSLCertificateFile directive is needed.
SSLCertificateFile /etc/apache2/ssl/example.com/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/example.com/apache.key
</VirtualHost>
</IfModule>

В данном коде нужно отредактировать несколько строк:

  • ServerAdmin: введите адрес электронной почты вебмастера;
  • ServerName: укажите доменное имя. Обратите внимание: домен нужно указывать без www;
  • DocumentRoot: укажите каталог, в котором хранится информация сайта. В настоящее время код указывает на каталог Apache по умолчанию. Скорее всего, на сервере будет два разных root-каталога для двух различных виртуальных хостов;
  • SSLCertificateFile: данная директива указывает на расположение файла сертификата. Сертификат для каждого сайта хранится в созданном ранее отдельном каталоге (см. раздел 1);
  • SSLCertificateKeyFile: эта директива указывает на расположение ключа сертификата. Ключ для каждого сертификата хранится в одном каталоге с самим сертификатом.

5: Редактирование файла ports.conf

Теперь нужно убедиться, что несколько сертификатов работают  на одном сервере; для этого нужно, чтобы сервер прослушивал порт 443. Внесите в конфигурационный файл портов Apache следующую строку (выделена жирным):

sudo nano /etc/apache2/ports.conf
NameVirtualHost *:80
NameVirtualHost *:443
Listen 80
<IfModule mod_ssl.c>
# If you add NameVirtualHost *:443 here, you will also have to change
# the VirtualHost statement in /etc/apache2/sites-available/default-ssl
# to
# Server Name Indication for SSL named virtual hosts is currently not
# supported by MSIE on Windows XP.
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>

6: Активация виртуальных хостов

В завершение активируйте виртуальные хосты. К счастью, Apache позволяет легко активировать и деактивировать хосты.

sudo a2ensite example.com
sudo a2ensite example.org

Активировав хосты, перезапустите Apache:

sudo service apache2 restart

Теперь у каждого сайта есть собственное доменное имя и SSL-сертификат.

Оба сайта можно просмотреть (с сертификатами и без), просто введя доменное имя (то есть, example.com или example.org) или https//:доменное_имя (https://example.com или https://example.org).

Tags: , , , , , ,

1 комментарий

  • Коля:

    Подскажите пожалуйста, сделал все как у вас описано, один сайт открывается второй нет, выдает 500 ошибку, в чем может быть проблема?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>