web.configファイルを使用してHTTPSを強制する方法


220

私はこれの解決策を見つけようとしてGoogleとStackOverflowの周りを検索しましたが、それらはすべてASP.NETなどに関連しているようです。

通常、サーバーでLinuxを実行していますが、この1つのクライアントでは、IIS 7.5(およびPlesk 10)でWindowsを使用しています。これが、IISとweb.configファイルに少し慣れていない理由です。で.htaccessファイルあなたは、プロトコルはHTTPSし、それに応じてリダイレクトするかどうかを検出するために、リライトの条件を使用することができます。web.configファイルを使用して、または私がインストールした ' URL Rewrite 'モジュールを使用してこれを実現する簡単な方法はありますか?

私はASP.NETの経験ないので、これがソリューションに関係している場合は、実装方法の明確な手順を含めてください。

PHPではなく web.configでこれを行う理由は、サイト内のすべてのアセットに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 この特定のソリューションは、URL書き換えモジュールのみを使用して行われるため、ASP.NET / PHPまたはその他のテクノロジーとは何の関係もありません。リクエストがコードのポイントに到達する前に、初期/下位レベルのいずれかで処理されます。実行されます。


6
@BenCarey Strict-Transport-Securityヘッダーも確認する必要があります:en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
LazyOne

22
{REQUEST_URI}の一部であるため、クエリ文字列が追加されないようにリダイレクトを変更することをお勧めします(それ以外の場合、パラメーターは2回追加されます)。 <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
franzo 2014年

6
これは機能しますが、残念ながらlocalhostでも機能します。これを回避するには、これを<conditions>に追加します。<add input = "{HTTP_HOST}" pattern = "localhost" negate = "true" />
wezzix

5
AWS Elastic beanstalkを使用して、このメソッドは、私が変更するまで302 Too manyリダイレクトを与えていました:<match url=".*"/>to<match url="http://*.*" />
Kevin R.

1
@Sam URL書き換えモジュールがインストールされていない可能性がありますか?IISにはデフォルトで付属していません。個別にインストールする必要があります。例:docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/…– LazyOne
07/26

80

ASP.NET MVCを使用しているユーザー向け。RequireHttpsAttributeを使用して、すべての応答を強制的にHTTPSにすることができます。

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

サイトを保護するために実行したいその他のこと:

  1. 偽造防止トークンにSSL / TLSを使用させる:

    AntiForgeryConfig.RequireSsl = true;
  2. Web.configファイルを変更して、デフォルトでHTTPSを要求するようにCookieを要求する:

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
  3. NWebSec.Owin NuGetパッケージを使用し、次のコード行を追加して、サイト全体でStrict Transport Security(HSTS)を有効にします。以下にPreloadディレクティブを追加して、サイトを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. 使用するURLにhttpsスキームを含めます。コンテンツセキュリティポリシー(CSP) HTTPヘッダーおよび一部のブラウザーでスキームを模倣すると、サブリソース整合性(SRI)がうまく機能しません。HTTPSについて明示することをお勧めします。例えば

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
  6. 使用するASP.NET MVC定型で、このすべてとはるかに内蔵したプロジェクトを生成するためのVisual Studioプロジェクトテンプレートを。また、上のコードを表示することができますGitHubの


4
質問はASP.NETを要求しますが、WebFormsやMVCについては述べていないため、MVC(Web.configファイルを使用してHTTPSを強制しない)を使用しているユーザーに包括的な回答を提供しましたが、それでも...
Muhammad Rehan Saeed

6
a)ソリューションは機能しますが、状況は変化しました。この目立つ、高評価の質問は、MVCに組み込まれているものを使用して更新された回答に値します。b)答えはすべてのベースをカバーしようとします。質問は単純ではありません。サイト全体でHTTPSを有効にするには、web.configファイルを変更するだけでは不十分です。読者は、Web.configファイルを変更するだけでよいと誤解するかもしれません。不完全で古い答えがないため、セキュリティは十分に困難です。
Muhammad Rehan Saeed

11
私の意見では、これは優れた価値のある答えです。誰かがトピックをグーグルで検索してこの質問に向けられたとき、私はあなたの答えがここにあることを嬉しく思います。
James K. Polk大統領

1
@MuhammadRehanSaeedニースの投稿。SRIをリストに追加しませんか?scotthelme.co.uk/subresource-integrity
ネイサン

1
@MuhammadRehanSaeed true-「あなたのサイトを保護するためにあなたがしたいかもしれない他のこと」の見出しが私にそれを思い起こさせたと思います:)
Nathan

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を照合します。次に、他のすべての条件がtrueかどうかを確認します。HTTPSがオフになっています。まあ、それは1つの条件にすぎません(ただし、それが真であることを確認してください)。ある場合は、301永久リダイレクトをクライアントに送信します。http://www.foobar.com/whatever?else=the#url-contains。クエリ文字列が重複するため、最後にクエリ文字列を追加しないでください。

これが、プロパティ、属性、および一部の値の意味です。

  • 晴れは、他の方法で継承する可能性があるすべてのサーバールールを削除します。
  • ルールは定義します。
    • 名前ルールの名前(一意なが)任意の。
    • stopProcessing要求をIIS要求パイプラインにすぐに転送するか、最初に追加のルールを処理するか。
  • このルールをいつ実行するかと一致します。
    • URLを評価するパターンのURL
  • 条件このルールを実行する際の追加条件。条件が最初に一致した場合にのみ処理されます。
    • logicalGroupingは、すべての条件が真でなければならない(MatchAll)か、いずれかの条件が真でなければならない(MatchAny); ANDとORに似ています。
  • addは、満たさなければならない条件を追加します。
    • 条件が評価している入力を入力します。入力はサーバー変数にすることができます。
    • 入力を評価する基準となるパターンを作成します。
    • 大文字と小文字が区別されるかどうかにかかわらず、ignoreCase
  • matchとそのconditionsすべてが真である 場合のアクション
    • タイプは一般的にredirect(クライアント側)またはrewrite(サーバー側)です。
    • このルールの結果として何を生成するかを示すURL。この場合、https://2つのサーバー変数を連結します。
    • redirectType使用するHTTPリダイレクト。これは301パーマネントです。
    • appendQueryString結果の最後にクエリ文字列を追加するかどうかurl。この例では、{REQUEST_URI}すでに含まれているため、falseに設定しています。

サーバー変数は

  • {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
ただし、/home?key=value#fragmentローカルで使用することを目的としているため、URLのフラグメント部分(から)はブラウザによってサーバーに設定されません。
LazyOne 2017年

@LazyOne質問。上記のweb.configを使用して、greenearth.game / about#fooからHTTPS にリダイレクトしています。HTTPSへの切り替えには#fooフラグメントが含まれます。#foo部分がサーバーに送信されない場合、リダイレクトにはどのように含まれますか?
Shaun Luttin 2017年

ブラウザで扱います。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 2017年

1
en.wikipedia.org/wiki/Fragment_identifier - 「クライアントが断片はHTTPリダイレクトに参加しません(下記参照)は、ドキュメントを取得する際のサーバーにURI-断片を送ることになって、ローカルアプリケーションからの助けがないわけではありません」 -最後のコメントを誤解した場合に備えて明確にするために。
LazyOne 2017年

6

受け入れられた答えは私にとってはうまくいきませんでした。私はこれについての手順に従いましたブログ

私にとって欠けていた重要な点は、IIS用のURL書き換えツールをダウンロードしてインストールする必要があったことです。ここで見つけ結果は次のとおりでした。

<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ライブラリはupgrade-insecure-requests、内のタグを使用して、リクエストをHTTPからHTTPSにアップグレードできますWeb.config

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

0

自分の環境にURL Rewriteをインストールすることが許可されていなかったため、別のパスを見つけました。

これを私の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>

私は他のどこかで1か所ですべてのピースを見つけることができなかったので、誰かがこれが役立つと思うことを望みます。


-7

簡単な方法は、 HTTPリクエストのためのカスタムエラーファイルを送信するためにIISを伝えることです。ファイルには、メタリダイレクト、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>

なぜ反対票なのですか?それは機能し、質問に答えます。
2015年

14
ファイルが見つからないことをGoogleに伝え、JavaScriptを使用してリダイレクトしているため、これは反対票です。
Thomas Bennett
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.