Благодаря 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).