Назад | Перейти на главную страницу

nginx и SNI: возможно ли автоматическое разрешение SSL-сертификата по имени домена

Мне нужно настроить сервер, который будет передавать один и тот же контент через SSL, используя разные доменные имена. Проблема в том, что мне нужна возможность как можно проще добавлять новые доменные имена. Предполагая, что все доменные имена уже настроены для моего сервера, я предполагаю, можно ли настроить nginx (или, возможно, другой обратный прокси) таким образом, чтобы он прослушивал все запросы к определенному IP-адресу и после получения запроса HTTPS попытался найти сертификат для домена, который использовался для выполнения этого запроса в какой-либо папке или БД и обслуживания запроса, если сертификат был найден (чтобы мы могли установить безопасное соединение), или отклонить соединение, если сертификат не был найден.

Я не уверен, что это вообще возможно, или, может быть, я думаю о чем-то безрассудном, но, поскольку мне не удалось найти никакой информации в сети, я решил спросить здесь.

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

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

Однако SNI еще не поддерживается некоторыми браузерами (все современные браузеры поддерживают). В этих браузерах может отображаться сообщение о недопустимом сертификате.

Если вы хотите отклонить соединения для некоторых vhosts без сертификата, вам просто не следует включать ssl на этих vhosts. Добавьте сервер по умолчанию, который перехватывает все соединения для неизвестных vhosts на ssl-порту и возвращает ошибку (403 запретить или нестандартный 444 для tcp reset):

server {
    listen 433 default_server ssl;
    ssl_certificate       common.crt;
    ssl_certificate_key   common.key;
    return 403;
}

Вы не можете предотвратить сообщение о недопустимом сертификате на vhosts без ssl, так как невозможно отменить соединение tcp до подтверждения ssl с помощью nginx. Вы можете попробовать iptables отклонить ssl-рукопожатия, отличные от sni, но это может быть немного сложно правильно настроить и, вероятно, потребует некоторых знаний спецификаций ssl.