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

Обновите HTTP-соединение до SSL / TLS

В настоящее время у меня есть сервер, который автоматически перенаправляет все HTTP-запросы на эквивалентный HTTPS-сайт. Проблема в том, что некоторые браузеры не принимают сертификат SSL (StartSSL.com) или не поддерживают SNI, поэтому они получают предупреждение о сертификате, и пользователь не будет продолжать просмотр веб-сайта.

Есть ли какой-либо механизм, который пытается заставить браузер использовать HTTPS вместо обычного HTTP, и когда это не работает (например, сертификат не принят или SNI не поддерживается), он продолжает использовать HTTP.

В настоящее время я использую Apache 2.4 с несколькими виртуальными хостами, которые перенаправляют HTTP-соединение с Redirect / https://domain.example/.

Браузер никогда не должен самостоятельно переходить на http, если https не работает, потому что все, что нужно сделать злоумышленнику, - это сделать https недоступным (например, заблокировать порт 443). Таким образом, единственный способ сделать это - дать браузеру команду сделать это с сервера, например отправив http-редирект. Конечно, это должно быть отправлено через защищенное соединение (иначе злоумышленник может подделать его), но, к сожалению, именно ваша проблема заключается в том, что безопасное соединение не работает.

В итоге: нет, это невозможно, и так лучше.

Кстати, все современные браузеры поддерживают SNI, но не все приложения (например, приложения Java и т. Д.). Если у вас есть несколько доменов на веб-сервере, но только один, необходимый для этих приложений, вы можете установить сертификат для этого домена по умолчанию. В противном случае вам нужно будет получить (более дорогой) сертификат, который содержит все необходимые домены в качестве альтернативных имен субъектов.

Отредактируйте с другой идеей: вы можете попробовать загрузить изображение со своей стороны по https и проверить успешность с помощью обработчика ошибок onerror в теге img. Возможно, это не вызывает видимого пользователем предупреждения, а вместо этого просто не загружается. И если это удастся, вы знаете, что доступ https возможен, и перенаправляете пользователя.

Кроме того, вы должны спросить себя, почему вы вообще хотите предлагать https, если вы также принимаете доступ с помощью http. Либо есть данные, которые следует защищать, либо их нет. Если вы предлагаете откат к http, злоумышленнику легко применить http вместо https.

Прежде всего, должна быть возможность указать один сертификат для использования для всех клиентов, не поддерживающих SNI. Это означает, что из всех доменов, размещенных на этом IP-адресе, вы можете иметь хотя бы один из них, работающий для клиентов без SNI.

Что вы могли бы сделать при перенаправлении с http на https, так это двухэтапное перенаправление. Первое перенаправление с http на https использует доменное имя, которое, как вы уверены, будет работать с поддержкой SNI или без нее. Должен быть включен полный исходный URL-адрес, чтобы с этого https-сайта вы могли впоследствии перенаправить на нужный.

Доменное имя, которое работает с SNI или без него, может вести себя по-разному в зависимости от того, поддерживается ли SNI клиентом. Таким образом вы будете знать, что клиент поддерживает SNI, прежде чем перенаправить его в домен, для которого требуется SNI.

Как именно настроить это на Apache, я буду немного догадываться (поскольку я никогда не настраивал Apache с более чем одним сертификатом). Я предполагаю, что способ сделать это - создать виртуальные хосты на основе имен для всех доменов, включая промежуточный домен.

Затем создайте виртуальный хост по умолчанию для клиентов без SNI, который использует тот же сертификат, что и тот, который использует это имя. Эти два виртуальных хоста с одинаковым сертификатом будут отправлять клиентам разные перенаправления в зависимости от того, поддерживают ли они SNI.

Наконец, я бы включил IPv6 на сервере. Используя IPv6, вы получаете достаточно IP-адресов, которые можно назначить каждому виртуальному хосту. Один и тот же набор виртуальных хостов может иметь имя на основе IPv4 и IP на основе IPv6, поэтому вам не нужно дублировать любую конфигурацию таким образом.

Конечным результатом будет установка, которая работает до тех пор, пока клиент поддерживает либо SNI, либо IPv6. Только клиенты, которые не поддерживают ни то, ни другое, не будут иметь проблемы, но вы все равно сможете их обнаружить и отправить другое перенаправление или сообщение об ошибке.

Что касается клиентов, которым не нравится CA, я предлагаю только распознать их по их пользовательскому агенту и обращаться с ними так, как вам кажется подходящим. Убедитесь, что у вас есть ссылка на https-сайт, по которой они могут перейти, если вы по ошибке включили слишком много клиентов.

Просто дикая догадка: может быть, у вас нет SSLCertificateChainFile в вашей конфигурации apache, которая включает файл sub.class1.server.ca.pem, который вам нужен для StartSSL?