Як змусити HTTPS використовувати файл web.config


220

Я шукав навколо Google і StackOverflow, намагаючись знайти рішення для цього, але вони, схоже, стосуються ASP.NET тощо.

Зазвичай я запускаю Linux на своїх серверах, але для цього одного клієнта я використовую Windows з IIS 7.5 (та Plesk 10). Тому я трохи не знайомий з файлами IIS та web.config . У .htaccessфайлі ви можете використовувати умови перезапису, щоб визначити, чи є протокол HTTPS, і перенаправити відповідно. Чи є простий спосіб досягти цього за допомогою файлу web.config або навіть за допомогою модуля " Перезапис URL-адрес ", який я встановив?

Я не маю досвіду роботи з ASP.NET, тому якщо це стосується рішення, то, будь ласка, включіть чіткі кроки, як реалізувати.

Причиною того, що я роблю це за допомогою web.config, а не PHP, є те, що я хотів би застосувати HTTPS на всіх активах сайту.



Відповіді:


427

Вам потрібен модуль перезапису URL-адрес, бажано v2 (у мене не встановлено v1, тому не можу гарантувати, що він буде там працювати, але він повинен).

Ось приклад такої web.config - вона змусить HTTPS для ВСІХ ресурсів (використовуючи 301 постійну переадресацію):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="Redirect to https" stopProcessing="true">
                    <match url=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

PS Це конкретне рішення не має нічого спільного з ASP.NET/PHP або будь-якою іншою технологією, оскільки це робиться лише за допомогою модуля переписування URL-адреси - він обробляється на одному з початкових / нижчих рівнів - перш ніж запит потрапить до точки, де ваш код отримує страту.


6
@BenCarey Також слід поглянути на Strict-Transport-Securityзаголовок: en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
LazyOne

22
Я рекомендую змінити переадресацію, щоб вона не додала рядок запиту, оскільки вона вже є частиною {REQUEST_URI} (інакше параметри додаються двічі). <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
Францо

6
Це працює, але, на жаль, і на localhost. Щоб уникнути цього, ви можете додати це до <conditions>: <add input = "{HTTP_HOST}" pattern = "localhost" negate = "true" />
wezzix

5
Використовуючи AWS Elastic Beanstalk, цей метод давав мені перенаправлення 302, поки я не змінив: <match url=".*"/>до<match url="http://*.*" />
Кевін Р.

1
@Sam Можливо, у вас не встановлений модуль перезапису URL-адрес? Він не поставляється з IIS за замовчуванням, його потрібно встановлювати окремо. Наприклад, docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/…
LazyOne

80

Для тих, хто використовує ASP.NET MVC. Ви можете використовувати RequireHttpsAttribute, щоб змусити всі відповіді бути HTTPS:

GlobalFilters.Filters.Add(new RequireHttpsAttribute());

Інші речі, які ви також можете зробити, щоб захистити свій сайт:

  1. Примушуйте маркери проти підробки використовувати SSL / TLS:

    AntiForgeryConfig.RequireSsl = true;
  2. Запропонуйте файлам cookie вимагати HTTPS за замовчуванням, змінивши файл Web.config:

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
  3. Скористайтеся пакетом NWebSec.Owin NuGet та додайте наступний рядок коду, щоб увімкнути сувору безпеку транспорту (HSTS) на сайті. Не забудьте додати директиву попереднього завантаження нижче та подати свій сайт на веб-сайт HSTS Preload . Більше інформації тут і тут . Зауважте, що якщо ви не використовуєте OWIN, на веб- сайті NWebSec є метод Web.config, про який можна прочитати .

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
  4. Скористайтеся пакетом NWebSec.Owin NuGet та додайте наступний рядок коду, щоб увімкнути прив'язку відкритого ключа (HPKP) на сайті. Більше інформації тут і тут .

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHpkp(options => options
        .Sha256Pins(
            "Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=",
            "Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=")
        .MaxAge(days: 30));
  5. Включіть схему https у будь-яку використану URL-адресу. HTTP-заголовок політики безпеки вмісту (CSP) та цілісність субресурсів (SRI) не грають добре, коли ви імітуєте схему в деяких браузерах. Краще бути явним щодо HTTPS. напр

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
  6. Використовуйте шаблон проекту ASP.NET MVC Boilerplate Visual Studio, щоб створити проект із усім цим і багато іншого, що вбудовано. Ви також можете переглянути код на GitHub .


4
Питання задає ASP.NET, але не вказує WebForms або MVC, тому я дав вичерпну відповідь для тих, хто використовує MVC (Який не використовує файл Web.config для примусового HTTPS) і все-таки ...
Мухаммед Рехан Саїд

6
a) Рішення працює, але все змінилося, це видатне, високо оцінене запитання заслуговує на оновлений відповідь, використовуючи те, що вбудовано в MVC. б) Відповідь намагається охопити всі основи. Питання не просте, якщо ввімкнути HTTPS на всьому сайті потрібно набагато більше, ніж зміна файлу web.config. Читачів можуть ввести в оману, щоб змінити файл Web.config - все, що потрібно. Безпека досить жорстка, як і без неповних / застарілих відповідей.
Мухаммед Рехан Саїд

11
На мою думку, це відмінна і цінна відповідь. Коли хтось гугла на тему і спрямований на це питання, я радий, що ваша відповідь тут.
Президент Джеймс К. Полк

1
@MuhammadRehanSaeed Хороший пост. Може додати SRI до свого списку? scotthelme.co.uk/subresource-integrity
Натан

1
@MuhammadRehanSaeed вірно - я думаю, що ваш заголовок "Інші речі, які ви також можете зробити, щоб захистити свій сайт", змусив мене подумати про це :)
Натан

14

Щоб збільшити відповідь LazyOne, ось пояснений варіант відповіді.

<rewrite>
  <rules>
     <clear />
     <rule name="Redirect all requests to https" stopProcessing="true">
       <match url="(.*)" />
         <conditions logicalGrouping="MatchAll">
           <add input="{HTTPS}" pattern="off" ignoreCase="true" />
         </conditions>
         <action 
            type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" 
            redirectType="Permanent" appendQueryString="false" />
     </rule>
  </rules>
</rewrite>

Очистіть усі інші правила, які вже могли бути визначені на цьому сервері. Створіть нове правило, яке назвемо "Перенаправити всі запити на https". Після обробки цього правила більше не обробляйте правила! Збігайте всі вхідні URL-адреси. Потім перевірте, чи справді всі ці інші умови: HTTPS вимкнено. Ну, це лише одна умова (але переконайтеся, що це правда). Якщо це так, відправте клієнт 301 Постійне переадресація назад за адресою http://www.foobar.com/whatever?else=the#url-contains. Не додайте рядок запиту в кінці цього, оскільки це дублює рядок запиту!

Ось що означають властивості, атрибути та деякі значення.

  • clear видаляє всі правила сервера, які ми могли б інакше успадкувати.
  • правило визначає правило.
    • назвіть довільну (хоча унікальну) назву для правила.
    • stopProcessing: пересилати запит негайно на конвеєр запиту IIS або спочатку обробляти додаткові правила.
  • відповідати, коли запустити це правило.
    • URL- шаблон, за яким можна оцінити URL-адресу
  • створює додаткові умови щодо виконання цього правила; умови обробляються, лише якщо є перша відповідність.
    • логічнегрупування, чи всі умови повинні бути правдивими ( MatchAll), чи будь-яка з умов повинна бути істинною ( MatchAny); - схожий на AND vs OR.
  • add додає умову, яку необхідно виконати.
    • введіть вхід, який оцінює умова; вхід може бути змінним сервера.
    • викрійка стандарту, на основі якого можна оцінити вхід.
    • ignoreCase - велике значення має капіталізація чи ні.
  • дія, що робити, якщо matchі conditionsвсе це правда.
    • тип може бути redirect(клієнтська) або rewrite(серверна).
    • URL, що потрібно отримати в результаті цього правила; в цьому випадку об'єднайте https://дві серверні змінні.
    • redirectType, що перенаправлення HTTP використовувати; цей - 301 Постійний.
    • appendQueryString, додавати рядок запиту в кінці результату urlчи ні; у цьому випадку ми встановлюємо це значення false, оскільки воно {REQUEST_URI}вже включає його.

Змінні сервера є

  • {HTTPS}що є OFFабо ON.
  • {HTTP_HOST}є www.mysite.com, і
  • {REQUEST_URI} включає решту URI, наприклад /home?key=value
    • браузер обробляє #fragment(див. коментар від LazyOne).

Дивіться також: https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference


1
Одне зауваження, однак: фрагментарна частина URL-адреси (від /home?key=value#fragment) браузерами не встановлюється на сервер, оскільки це означало, що використовується локально.
LazyOne

@LazyOne Питання. Ми використовуємо вищевказаний web.config успішно для переадресації з greenearth.game/about#foo на HTTPS. Перехід на HTTPS включає фрагмент #foo. З огляду на те, що частина #foo не надсилається до sever, як перенаправлення включає її?
Shaun Luttin

Це обробляється браузером. Просто відкрийте вкладку мережі в Google Chrome (або подібну в Firefox тощо) і подивіться, яка URL-адреса насправді запитується (наприклад, для http://www.example.com/members#oopsзапиту буде надісланий запит, на http://www.example.com/membersякий потім буде переспрямовано на версію HTTPS на https://www.example.com/members- браузер робить все інше)
LazyOne

@LazyOne Дякую за це. Якщо я пам'ятаю правильно, є кілька помилок WebKit, які запобігають включенню фрагмента до переадресації. Отже, це має сенс. bugs.webkit.org/show_bug.cgi?id=24175
Shaun Luttin

1
en.wikipedia.org/wiki/Fragment_identifier - "Клієнти не повинні надсилати URI-фрагменти серверам, коли вони отримують документ, і без допомоги локальної програми (див. нижче) фрагменти не беруть участі у перенаправленнях HTTP" - щоб було зрозуміло, якщо я неправильно зрозумів ваш останній коментар.
LazyOne

6

Прийнята відповідь не спрацювала для мене. Я дотримувався кроків у цьому блозі .

Ключовим моментом, якого для мене не вистачало, було те, що мені потрібно було завантажити та встановити інструмент перезапису URL-адреси для IIS. Я знайшов це тут . Результатом було таке.

<rewrite>
        <rules>
            <remove name="Http to Https" />
            <rule name="Http to Https" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
                <match url="*" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" />
                </conditions>
                <serverVariables />
                <action type="Redirect" url="https://{HTTPS_HOST}{REQUEST_URI}" />
            </rule>
        </rules>
    </rewrite>

1

У .Net Core дотримуйтесь інструкцій на веб-сторінці https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl

У свій startup.cs додайте наступне:

// Requires using Microsoft.AspNetCore.Mvc;
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new RequireHttpsAttribute());
    });`enter code here`

Щоб перенаправити Http на Https, додайте наступне у startup.cs

// Requires using Microsoft.AspNetCore.Rewrite;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    var options = new RewriteOptions()
       .AddRedirectToHttps();

    app.UseRewriter(options);

0

Відмінна бібліотека NWebsec може оновити ваші запити з HTTP до HTTPS, використовуючи її upgrade-insecure-requestsтег у межах Web.config:

<nwebsec>
  <httpHeaderSecurityModule>
    <securityHttpHeaders>
      <content-Security-Policy enabled="true">
        <upgrade-insecure-requests enabled="true"  />
      </content-Security-Policy>
    </securityHttpHeaders>
  </httpHeaderSecurityModule>
</nwebsec>

0

Мені не було дозволено встановлювати Перезапис URL-адрес у моєму середовищі, тож я знайшов інший шлях.

Додавши це до мого web.config додав переписування помилок і працював над IIS 7.5:

<system.webServer>
    <httpErrors errorMode="Custom" defaultResponseMode="File" defaultPath="C:\WebSites\yoursite\" >    
    <remove statusCode="403" subStatusCode="4" />
    <error statusCode="403" subStatusCode="4" responseMode="File" path="redirectToHttps.html" />
</httpErrors>

Потім, дотримуючись поради тут: https://www.sslshopper.com/iis7-redirect-http-to-https.html

Я створив файл html, який виконує переадресацію (redirectToHttps.html):

<html>
<head><title>Redirecting...</title></head>
<script language="JavaScript">
function redirectHttpToHttps()
{
    var httpURL= window.location.hostname + window.location.pathname + window.location.search;
    var httpsURL= "https://" + httpURL;
    window.location = httpsURL;
}
redirectHttpToHttps();
</script>
<body>
</body>
</html>

Я сподіваюся, що хтось вважає це корисним, оскільки я не міг знайти всіх частин в іншому місці ніде.


-7

Простий спосіб це сказати IIS , щоб відправити призначений для користувача файл помилок для HTTP запитів. Потім файл може містити мета-переадресацію, переспрямування JavaScript та вказівки із посиланням тощо. Важливо, що ви все одно можете перевірити "Потрібна SSL" для сайту (або папки), і це спрацює.

</configuration>
</system.webServer>
    <httpErrors>
        <clear/>
        <!--redirect if connected without SSL-->
        <error statusCode="403" subStatusCode="4" path="errors\403.4_requiressl.html" responseMode="File"/>
    </httpErrors>
</system.webServer>
</configuration>

Чому саме нижній Це працює і відповідає на питання.
перенаправлення

14
Це голосування за відмову, оскільки ви говорите Google, що ваш файл не знайдено, а потім використовуєте JavaScript для переадресації, що, як правило, є поганим.
Томас Беннетт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.