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

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

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

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам