08e15d7e0337cc4b93dcの編集履歴
@@ -1 +1 @@
-ASP.NET CoreのRequireHttpsでハマったお話
+08e15d7e0337cc4b93dc
@@ -1,116 +1 @@
-# 概要
-
-つくづく自分はバカであると確信した。ということでタイトルのようなことに二度と陥らないようにするためのメモをば。
-
-## `RequireHttps`とは何か
-
-一応ですが軽く。
-`RequireHttpsAttribute`は Controller または Action に設定することで HTTPS 接続を強制するようにする属性クラスです。
-これが設定された Controller または Action に HTTP 接続をよこすと自動的に HTTPS で接続しなおすようリダイレクトがかかります。
-
-# 問題
-
-*`RequireHttps`を設定すると無限リダイレクトが発生する*
-
-これですが、デフォルトの Kestrel をそのまま使わずに nginx 等でリバースプロキシを行ってホストすると起こるようです。
-というのも
-
-```
-client | --- HTTPS --- | nginx | --- HTTP --- | Kestrel
-```
-
-このように nginx と ASP.NET Core 間の接続がHTTPになってしまっていたため、
-
-1. クライアントが HTTPS で nginx と通信
-2. nginx は受け取った内容を Kestrel に HTTP で送る
-3. Kestrel 側は当然 HTTP でリクエストを受け取るため `RequireHttps` 属性のついたアクションにおいて HTTPS で通信し直すようリダイレクトを要求
-4. nginx は Kestrel から受け取ったリダイレクトの要求をそのままクライアント側に HTTPS で返却
-5. クライアント側は全く同じエンドポイントにリダイレクトされる
-
-といった状況に陥るようです。これはリバースプロキシに送られる`X-Forwarded-Proto`をはじめとしたヘッダーを受け取れていないため発生します。
-
-# 解決方法
-
-次のコードをいい感じの位置に差し込みます。
-
-```csharp:Startup.cs
-public void Configure(IApplicationBuilder app, IHostingEnvironment env)
-{
-
- // 前略
-
- app.UseForwardedHeaders(new ForwardedHeadersOptions()
- {
- ForwardedHeaders = ForwardedHeaders.All
- });
-
- // 後略
-
-}
-```
-
-これで X-Forwarded-Proto ヘッダーを読み込むようになるので、もうリダイレクトが発生することはありません。
-
-<!--
-
-[[[ Markdown で本文を読みに来るなんてエッチね!(オレオレ証明書式の方法をコメントアウトしてここに残しておきます) ]]]
-
-というわけで Kestrel と nginx 間の接続にも HTTPS を使用するように設定します。
-
--## オレオレ証明書の作成
-
-この一行で OK です。
-
-```shell
-openssl genrsa 4096 > server.key && openssl req -new -key server.key | openssl x509 -days 32767 -req -signkey server.key > server.crt && openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx
-```
-
-コマンドを実行するといくつか質問が出てきますが、テキトーに答えていきます。
-
-* server.key
-* server.crt
-* server.pfx
-
-が生成されたら成功です。
-
--## オレオレ証明書の読み込み
-
-ポート 5443 にリバースプロキシさせる例だとこのようになります。ポート番号は 1024 番以降でユニークであれば何でも構いません。
-
-```csharp:Program.cs
-public static IWebHost BuildWebHost(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .UseKestrel(options =>
- {
- options.Listen(IPAddress.Loopback, 5443, configure =>
- {
- /* 証明書にパスワードを設定しなかった場合 */
- configure.UseHttps("server.pfx");
-
- /* 証明書にパスワードを設定した場合 */
- configure.UseHttps("server.pfx", "ここにパスワード");
- });
- })
- .UseStartup<Startup>()
- .Build();
-```
-
--->
-
-# 結論
-
-セキュリティ事項は ASP.NET Core が用意しておいてくれる機能に任せておけば一通りのセキュリティ問題は安心ですね!(フラグ)
-
-## 蛇足
-
-穴にハマっといてこんなこというのも変な話ですが ASP.NET Core は基本的なことならなんでもフレームワーク側で取り扱ってくれるので、非常にお手軽に高度なウェブアプリケーションを構築することができます。
-まだ試したことのない方は是非一度 [.NET Core SDK をインストール](https://dot.net/)してみて下さい。
-コマンドを一行`dotnet new mvc`と打つだけでスッとテンプレートが準備され、
-さらに一行`dotnet restore`と打つだけで外部ライブラリを更新し、
-最後に一行`dotnet run`と打つだけでホストされる清々しさはなかなかいいものですよ。
-(この記事を読んでいる時点で完全未経験の方はいらっしゃらないとは思いますが)
-
-## 謝辞
-
-最後に、この問題を解決するに辺り @riku6460 氏にご協力を賜りました。ここに感謝の意を記させていただきます。
-
+`@see <https://qiita.com/1ed873c7e9a8edd9c695d2fa438cc1ed/items/08e15d7e0337cc4b93dc/revisions/1>`