web-dev-qa-db-ja.com

HTTPSでのみ.htaccessからHSTSヘッダーを設定する方法

私のWebアプリケーションは、私が制御する異なる数のホストで実行されます。各vhostのApache構成を変更する必要を防ぐために、リポジトリの.htaccessファイルを使用してほとんどの構成を追加し、各ホストの基本的なセットアップが数行になるようにします。これにより、新しいバージョンを展開するときに構成を変更することもできます。現在、.htaccessはヘッダーを設定(未設定)し、いくつかのリライトマジックを実行し、UAのキャッシュを制御します。

.htaccessを使用して、アプリケーションでHSTSを有効にします。ヘッダーを設定するだけです:

Header always set Strict-Transport-Security "max-age=31536000"

しかし、仕様には明確に「HSTSホストは、非セキュアなトランスポートを介して伝達されるHTTP応答にSTSヘッダーフィールドを含めてはなりません」と述べています。したがって、HTTP接続で送信するときにヘッダーを送信したくありません。 http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14 を参照してください。

環境変数を使用してヘッダーを設定しようとしましたが、そこで行き詰まりました。その方法を知っている人はいますか?

70
nielsr

簡単に使用できるHTTPS環境変数が利用できるようです。同じ質問を持つ人々のために:

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
100
nielsr

Nielsrの答えを基に、.htaccessで次のコードを使用して、 https://hstspreload.org での安全な展開の推奨事項を満たしました。これにより、ドメインがChromeブラウザーにハードコーディングされます。これにより、サブドメイン全体にHSTSが適用され、プリロードリストに含めることは簡単に元に戻せないので、rtfmに注意してください。

<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>
22
LJT

httpd.conf(これを編集するアクセス権がある場合)を使用できます

<VirtualHost 65.81.122.43:443>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
</VirtualHost>

注:HTTPS vhostのみに設定する必要があり、http vhostには設定できません。

.htaccessファイルを使用するタイミングと使用しないタイミング

.htaccessファイルを許可すると、サーバーにアクセスするたびにApacheがそれらを検索します。親ディレクトリも検索されるため、これにはある程度の(わずかな)時間を要し、サーバーのパフォーマンスに影響を与える可能性があります。 ソース

3
Aniket Thakur

https://hstspreload.org に準拠するために、これを使用してhtaccessファイルに配置できます。これを.htaccessファイルに入れます。

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_Host}/$1 [R=301,L]

RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_Host}/$1 [R=301,L,E=HTTPS:1]
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS

まず、非httpsからhttpsへのリダイレクトを行います。 HSTSヘッダーを使用して、非www httpsをwww httpsにリダイレクトします。

http://example.com -> https://example.com -> https://www.example.com - HSTSヘッダー付き)

https://hstspreload.org のテストおよび準拠

2
Yuda Prawira

さらに別の方法は、非SSL接続の場合は常にヘッダーを設定し、条件付きでヘッダーを削除することです。

Header always set   Strict-Transport-Security "max-age=31536000" early
Header        unset Strict-Transport-Security env=!HTTPS

これには、Headerディレクティブとenvフラグの両方でearlyディレクティブを使用できるという利点があります。単一のHeaderディレクティブでは、envearlyを一緒に使用することはできません。これらは相互に排他的です(公式ドキュメントを参照してください: https://httpd.Apache.org/docs /current/mod/mod_headers.html#header )。

1
studersi