Я ищу "лучший способ" безопасного перенаправления сайтов с помощью IIS7 и ASP.net. Скажем, у меня есть два доменных имени:
каждый с субдоменом www.
У меня есть один сертификат EV, который использует общее имя:
Таким образом, пользователь может получить доступ к сайту 8 различными способами:
- http://mydomain.com
- http://mydomain.net
- http://www.mydomain.com
- http://www.mydomain.net
- and also using https://
Чтобы пользователь не получал ошибок сертификата, он должен быть перенаправлен на
- https://www.mydomain.com
Как лучше всего сделать эту работу прозрачной для пользователя, при этом гарантируя, что IIS обслуживает только защищенный контент? Раньше я использовал web.config для перенаправления на такую подстраницу:
<system.webServer>
<httpRedirect destination="https://www.mydomain.com/secureSubPage" />
или с подстановочными сертификатами, используя этот блок на общей базовой странице:
if (!Request.IsSecureConnection)
{
Response.Redirect(Request.Url.ToString().Replace("http:", "https:"), true);
return;
}
if (!Request.Url.ToString().Contains(".com"))
{
Response.Redirect(Request.Url.ToString().Replace(".net", ".com"), true);
return;
}
Чтобы заставить весь трафик использовать HTTPS на https://www.mydomain.com
вы можете просто использовать одно правило перезаписи:
<rules>
<rule name="Force HTTPS" enabled="false" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTPS}" negate="true" pattern="^ON$" />
<add input="{HTTP_HOST}" negate="true" pattern="^www\.mydomain\.com$" />
</conditions>
<action type="Redirect" url="https://www.mydomain.com{REQUEST_URI}" appendQueryString="false" redirectType="Permanent" />
</rule>
</rules>
Это перенаправит весь трафик без HTTPS, независимо от имени домена, используемого для доступа к сайту, на https://www.mydomain.com
. Он также перенаправит https://mydomain.com
к https://www.mydomain.com
. Поскольку в настоящее время большинство сертификатов SSL включают домен с www и без него, это не вызовет ошибки в браузере.
Вышеупомянутое правило перенаправления не может помешать пользователям заходить на ваш сайт, например, https://www.mydomain.net
. Это связано с тем, что проверка имени заголовка хоста может быть выполнена только после того, как сеанс HTTPS был установлен, и до этого браузер уже покажет ошибку, поскольку имя домена не соответствует общему имени сертификата. Единственный способ предотвратить это - использовать отдельный IP-адрес для доменного имени. mydomain.com
и отдельный IP-адрес для всех других доменных имен, под которыми вы хотите, чтобы ваш сайт был доступен.
Для этого вы настраиваете свой DNS, чтобы (www.)mydomain.net
(и любые другие доменные имена, с которых вы хотите, чтобы ваш сайт был доступен), чтобы они указывали на IP-адрес X.X.X.1
. Этот IP-адрес привязан к фиктивному сайту только для HTTP в IIS. Единственная цель этого сайта - перенаправить весь трафик на https://www.mydomain.com
используя следующее правило перезаписи:
<rules>
<rule name="Redirect to https://www.mydomain.com" enabled="false" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" negate="true" pattern="^www\.mydomain\.com$" />
</conditions>
<action type="Redirect" url="https://www.mydomain.com{REQUEST_URI}" appendQueryString="false" redirectType="Permanent" />
</rule>
</rules>
Затем вы настраиваете другой сайт на IP-адресе. X.X.X.2
используя HTTP и HTTPS для (www.)mydomain.com
. Используя приведенное выше правило перезаписи (первое), вы форсируете HTTPS и используете www.mydomain.com
.
Это решение фактически сделает ваш сайт недоступным через HTTPS, если не указан правильный домен. mydomain.com
используется, но это также то, что вы хотите, потому что у вас нет действующих сертификатов для других доменных имен.