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

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

Что такое SNI?

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

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

Требования

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

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

Кроме того, на сервере должен быть установлен Nginx.

Для установки Nginx используйте команду:

sudo apt-get install nginx

Убедитесь, что протокол SNI включен:

nginx -V

После версии nginx должна быть такая строка:

TLS SNI support enabled

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

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

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

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

2: Создание ключа и запроса на подпись сертификата

Для начала создайте SSL-сертификат для example.com.

Перейдите в соответствующий каталог:

cd /etc/nginx/ssl/example.com

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

sudo openssl genrsa -des3 -out server.key 1024

Затем создайте запрос на создание сертификата:

sudo openssl req -new -key server.key -out server.csr

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

Самым важным полем является “Common Name”. Введите официальное доменное имя или IP-адрес сайта (если такого имени еще нет). Не заполняйте поля “Сhallenge password” и “Optional company name”.

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

3: Удаление пароля

Сертификат почти готов. Теперь нужно удалить пароль. Конечно, наличие пароля значительно повышает уровень безопасности. Но этот пароль придется повторно вводить при каждой перезагрузке nginx, чтобы веб-сервер снова был доступен в сети.

Чтобы удалить пароль, используйте команду:

sudo cp server.key server.key.org
sudo openssl rsa -in server.key.org -out server.key

4: Подпись SSL-сертификата

Сертификат почти готов, осталось только подписать его.

Имейте в виду: чтобы указать срок действия  сертификата, измените значение 365 на необходимое количество дней (опция -days). В данном случае срок сертификата истекает через год.

sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Сертификат для первого хоста готов.

Чтобы создать второй сертификат, перейдите в соответствующий каталог:

cd /etc/nginx/ssl/example.org

Снова выполните инструкции разделов 2-4. Получив оба сертификата, добавьте их на виртуальные хосты.

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

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

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

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

В каждом файле нужно разместить конфигурации виртуального хоста (не забудьте отредактировать строки server_name, ssl_certificate и ssl_certificate_key, внеся свои значения).

server {
listen   443;
server_name example.com;
root /usr/share/nginx/www;
index index.html index.htm;
ssl on;
ssl_certificate /etc/nginx/ssl/example.com/server.crt;
ssl_certificate_key /etc/nginx/ssl/example.com/server.key;
}

Теперь внесите конфигурации для второго хоста:

sudo nano /etc/nginx/sites-available/example.org
server {
listen   443;
server_name example.org;
root /usr/share/nginx/www;
index index.html index.htm;
ssl on;
ssl_certificate /etc/nginx/ssl/example.org/server.crt;
ssl_certificate_key /etc/nginx/ssl/example.org/server.key;
}

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

В завершение нужно активировать виртуальные хосты, создав символическую ссылку между каталогами sites-available и sites-enabled.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo ln -s /etc/nginx/sites-available/example.org /etc/nginx/sites-enabled/example.org

Теперь перезапустите nginx.

sudo service nginx restart

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

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

Tags: , , , , , ,

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