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

Вступление

Индикация имени сервера (Server Name Indication, или SNI) – это функция протокола TLS, которая позволяет установить несколько сертификатов SSL на один IP-адрес.

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

Требования

В данном руководстве используется два домена, на которых установлены самоподписные сертификаты 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: , , , , , ,

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