Установка нескольких SSL-сертификатов на один IP с помощью Lighttpd
Linux, VPS | Комментировать запись
Вступление
Индикация имени сервера (Server Name Indication, или SNI) – это функция протокола TLS, которая позволяет установить несколько сертификатов SSL на один IP-адрес.
Для выполнения данного руководства необходим установленный и запущенный Lighttpd. Чтобы это сделать, читайте статьи:
- Установка LLMP stack (Linux, Lighttpd, MySQL и PHP) на Ubuntu 12.04
- Установка LLMP stack (Linux, Lighttpd, MySQL и PHP) на CentOS
Требования
В данном руководстве используется два домена, на которых установлены самоподписные сертификаты SSL.
Домен 1: example.com
Общее имя: *.example.com
Домен 2: 8host.com
Общее имя: www.8host.com
Для настройки SSL необходим сертификат и виртуальный хост по умолчанию. Используйте сертификат первого домена.
Создание закрытых ключей
В /etc/lighttpd создайте каталог, в котором будут размещены ключи и сертификаты.
mkdir /etc/lighttpd/certs
Создайте закрытый ключ и введите фразовый пароль. Вторая команда удаляет пароль.
cd /etc/lighttpd/certs
openssl genrsa -des3 -out example.com.key 2048
openssl rsa -in example.com.key -out example.com.key
Выполните то же самое и для второго домена.
openssl genrsa -des3 -out 8host.com.key 2048
openssl rsa -in 8host.com.key -out 8host.com.key
Если фразовый пароль не удалить, Lighttpd будет запрашивать его после каждой перезагрузки.
Создание запроса на подпись сертификата (CSR)
Чтобы создать CSR для двух доменов:
cd /etc/lighttpd/certs
openssl req -new -key 8host.com.key -out 8host.com.csr
openssl req -new -key example.com.key -out example.com.csr
Введите всю необходимую информацию; чтобы оставить поле пустым, введите символ точки.
-----
Country Name (код из 2х букв) [AU]:US
State or Province Name (полное название области/штата) [Some-State]:.
Locality Name (город) []:NYC
Organization Name (название компании) [Internet Widgits Pty Ltd]: 8host Inc
Organizational Unit Name (отдел) []:.
Common Name (FQDN сервера или Ваше имя) []:www.8host.com
Email Address []:webmaster@8host.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Заполняя поле Common Name, будьте внимательны: нужно ввести не example.com, а *.example.com.
-----
Country Name (код из 2х букв) [AU]:IN
State or Province Name (полное название области/штата) [Some-State]:.
Locality Name (город) []:Chennai
Organization Name (компания) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (отдел) []:.
Common Name (FQDN сервера или Ваше имя) []:*.example.com
Email Address []:admin@example.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Чтобы различать данные сертификаты было проще, введите разные страну и город в CSR.
Подпись SSL-сертификатов
Опять же, чтобы легко отличить данные сертификаты, установите разный срок действия (аргумент -days).
cd /etc/lighttpd/certs
openssl x509 -req -days 100 -in example.com.csr -signkey example.com.key -out example.com.crt
openssl x509 -req -days 200 -in 8host.com.csr -signkey 8host.com.key -out 8host.com.crt
Создайте файл .pem с помощью сертификатов и их закрытых ключей.
cat example.com.{key,crt}> example.com.pem
cat 8host.com.{key,crt}> 8host.com.pem
Чтобы защитить данные файлы, оставляя право на чтение только root-пользователю.
chmod -R 400 /etc/lighttpd/certs/
Настройка Lighttpd для поддержки SSL
В конец файла /etc/lighttpd/lighttpd.conf внесите следующие строки:
$SERVER["socket"] == "0.0.0.0:443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/certs/example.com.pem"
$HTTP["host"] =~ "(^|www\.)8host.com" {
ssl.pemfile = "/etc/lighttpd/certs/8host.com.pem"
}
}
Поскольку сертификат example.com является сертификатом по умолчанию, его не нужно вносить в файл.
Перезапустите демон Lighttpd:
service lighttpd force-reload
Если в путях сертификатов или при создании файла .pem не было допущено ошибок, сервис будет успешно перезагружен.
Тестирование HTTPS
HTTPS можно очень легко протестировать с помощью curl.
При этом необходимо использовать аргумент –resolve, который сопоставляет домены с IP-адресами. Замените 1.1.1.1 IP-адресом своего сервера.
curl -k -o /dev/null --resolve "www.8host.com:443:1.1.1.1" -s -v https://www.8host.com
Это даст подробный вывод. Флаг -o перенаправляет HTML вывод, поскольку сейчас он не нужен. Вот фрагмент кода, на который нужно обратить внимание.
* SSL connection using AES256-SHA
* Server certificate:
* subject: C=US; L=NYC; O=8host Inc; CN=www. 8host.com; emailAddress=webmaster@8host.com
* start date: 2014-03-26 18:39:25 GMT
* expire date: 2014-10-12 18:39:25 GMT
* common name: www.8host.com (matched)
* issuer: C=US; L=NYC; O=8host Inc; CN=www. 8host.com; emailAddress=webmaster@8host.com
* SSL certificate verify result: self signed certificate (18), continuing anyway.
Изучите следующий домен.
curl -k -o /dev/null --resolve "www.example.com:443:1.1.1.1" -s -v https://www.example.com
Изучите подробности выведенного результата:
* SSL connection using AES256-SHA
* Server certificate:
* subject: C=IN; L=Chennai; CN=*.example.com; emailAddress=admin@example.com
* start date: 2014-03-26 18:39:20 GMT
* expire date: 2014-07-04 18:39:20 GMT
* common name: *.example.com (matched)
* issuer: C=IN; L=Chennai; CN=*.example.com; emailAddress=admin@example.com
* SSL certificate verify result: self signed certificate (18), continuing anyway.
Обратите внимание на поля subject и expire date данных результатов.
Попробуйте получить доступ непосредственно к IP-адресу.
пользователь@сервер~$ curl -k -o /dev/null -s -v https://1.1.1.1
* SSL connection using AES256-SHA
* Server certificate:
* subject: C=IN; L=Chennai; CN=*.example.com; emailAddress=admin@example.com
* start date: 2014-03-26 18:39:20 GMT
* expire date: 2014-07-04 18:39:20 GMT
* common name: *.example.com (does not match '128.199.206.19')
* issuer: C=IN; L=Chennai; CN=*.example.com; emailAddress=admin@example.com
* SSL certificate verify result: self signed certificate (18), continuing anyway.
Это выведет сертификат example.com.
Tags: CSR, HTTPS, Lighttpd, Linux, SNI, SSL, VPS