しばやん雑記

ASP.NET Core とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET Core の HSTS はデフォルトだと有効期間が短い

ASP.NET Core は 2.1 からプロジェクトの作成時に HTTPS 用の構成を有効化すると、デフォルトで本番環境の場合には HSTS が有効になっています。同時に HTTPS へのリダイレクトも有効になります。

デフォルトの HSTS は有効期間が 30 日と短めになっています。

HSTS は有効期間が切れるまで無効化出来ないので設定は慎重に行った方が良いのですが、本番向けとしては 30 日だと短すぎるということで Qualys SSL Labs でチェックすると警告が表示されます。

Qualys もブログで紹介しているように、一般的には 1 年ぐらいの有効期間が推奨されています。有効期間を設定するためには明示的に AddHsts を呼び出してオプションで MaxAge を設定してあげればよいです。

サブドメインに対しても有効化したい場合には IncludeSubDomains を設定します。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    services.AddHsts(options =>
    {
        options.MaxAge = TimeSpan.FromDays(365);
        options.IncludeSubDomains = true;
    });
}

これで HSTS のヘッダーが変更されました。設定は簡単でしたね。

f:id:shiba-yan:20190111155153p:plain

サイトを HSTS Preload に追加したい場合には includeSubDomains と preload の 2 つを返す必要がありますが、preload は ASP.NET Core でも設定から Preload を設定すれば良いです。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    services.AddHsts(options =>
    {
        options.MaxAge = TimeSpan.FromDays(730);
        options.IncludeSubDomains = true;
        options.Preload = true;
    });
}

Preload の登録サイトには max-age が 2 年間になっていたので、上の例でも 2 年間に設定しています。

ちなみに ASP.NET Core の HSTS はデフォルトでループバックアドレスの場合は無効化されているので、ローカルでの開発中には影響しないのが地味に便利です。

除外リストにドメインの追加も出来るので、特定のドメインだけ無効化も簡単です。