web-dev-qa-db-ja.com

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

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

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

私は持っていますASP.NETの経験はありませんそのため、これが解決策に関わっている場合は、実装方法の明確な手順を含めてください。

Web.configとnot PHPを使ってこれを行うのは、サイト内のすべてのアセットにHTTPSを強制したいからです。

193
Ben Carey

URL Rewriteモジュール、できれば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やその他のテクノロジとは関係ありません - リクエストの前に、初期レベルまたは下位レベルのいずれかで処理されます。あなたのコードが実行されるポイントに到達します。

384
LazyOne

ASP.NET MVCを使用している人のために。すべての応答をHTTPSにするには、RequireHttpsAttributeを使用します。

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

あなたのサイトを安全にするためにあなたがしたいと思うかもしれない他のこと:

  1. 偽造防止トークンにSSL/TLSの使用を強制します。

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

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
    
  3. NWebSec.OwinNuGetパッケージを使用して、サイト全体で厳密なトランスポートセキュリティ(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スキームを含めます。 Content Security Policy(CSP) HTTPヘッダーおよび Subresource Integrity(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 でコードを表示することもできます。

74

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は消えます。まあ、それはただ一つの条件です(しかしそれが本当であることを確認してください)。もしそうなら、http://www.foobar.com/whatever?else=the#url-containsでクライアントに301 Permanentリダイレクトを送り返してください。それがクエリ文字列を複製するので、その最後にクエリ文字列を追加しないでください。

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

  • clearは、他の方法で継承する可能性があるすべてのサーバールールを削除します。
  • ruleはルールを定義します。
    • nameルールの任意の(一意ではあるが)名前。
    • stopProcessing要求をすぐにIIS要求パイプラインに転送するか、最初に追加のルールを処理するかを指定します。
  • このルールを実行するときmatch
    • urlURLを評価するためのパターン
  • conditionsこのルールをいつ実行するかについての追加の条件。最初に一致した場合にのみ条件が処理されます。
    • logicalGroupingすべての条件が真(MatchAll)、またはいずれかの条件が真(MatchAny)である必要があります。 AND vs ORに似ています。
  • addは満たさなければならない条件を追加します。
    • input条件が評価している入力。入力はサーバー変数にすることができます。
    • pattern入力を評価する基準。
    • ignoreCase大文字と小文字の区別は関係ありません。
  • actionmatchとそのconditionsがすべて真ならばどうするか。
    • typeは通常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

11
Shaun Luttin

受け入れられた答えは私のために働かなかった。私はこれについての手順に従った blog

私にとって欠けていた重要な点は、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>
4
Steady

.Net Coreでは、 https://docs.Microsoft.com/ja-jp/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);
1
Oracular Man

私は自分の環境に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>

私は他の場所では一箇所にすべての部分を見つけることができなかったので、誰かがこれが有用であることを願っています。

0

優れた NWebsec ライブラリは、upgrade-insecure-requests内のWeb.configタグを使用して、リクエストをHTTPからHTTPSにアップグレードできます。

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