Azureにてクライアント証明書認証+TrafficManagerを使って冗長化しようとしてハマったので、同じ状況の方へ向けて
環境
Azure WebApps Asp.Net
○TrafficManager
×FrontDoor(クライアント証明書に対応していないです。)
クライアント証明書認証の実装(まだ実装してない方)
こちらの手順でWebサーバーにクライアント証明書を要求するよう設定し、
コード上に検証処理を追加します。
(記事に出てくる”X-ARR-ClientCert”ヘッダーはAzure特有なので、ローカル実行の際は証明書の検証処理をスキップする仕組みが必要です)
https://docs.microsoft.com/ja-jp/azure/app-service/app-service-web-configure-tls-mutual-auth
TrafficManagerを使ってWebサーバーを冗長化(まだ実装してない方)
Azureポータルでサービスを検索すると「Traffic Manager プロファイル」があるので、
作成します。
ルーティングの項目はとりあえず「優先度」にしました。
次にTrafficManagerに対して、Webサーバーを設定します。
TrafficManager>エンドポイント>追加
※秘儀Sublimeモザイク
名前とリソースを決めて作成
問題のクライアント証明書対応
TrafficManagerは定期的にWebサーバーの生存を確認します。(正常性プローブ)
この正常性プローブがHTTPSに対応しておらず、Webサーバーに実装しているクライアント証明書の検証が通らないそうです。
"X-ARR-ClientCert"ヘッダーが取れないんだと思います(予測)
Azureサポートに連絡して回答をいただき、
Traffic Manager の正常性プローブに対して、Web サーバー側でクライアント証明書の検証を
実施しないよう構成していただくか、正常性プローブを HTTP または TCP に変更していただくことで、
お客様のご要件を実現できる可能性がございます。
上記をふまえ、ご要件が実現可能かご検討いただけると幸いです。
私は前者の正常性プローブのリクエストに対して証明書の検証をスルーさせました。
私はなんとなく前者をやってできたので、後者は試してないのですが、
trafficmanager>構成
画像のプロトコルをHTTP、ポートを80にすれば証明書の検証が通るかもしれません。(というかデフォルトでそうなっている。)
私は作成時に考え無しにHTTPSにしたので、ハマりましたが、普通にやってればなにもなく作成できたかもしれないです。
正常性プローブでwebサーバーが正常になっているか確認します。
trafficmanager>エンドポイント
モニターの状況を確認して「オンライン」になっていれば大丈夫です(反映に多少遅延があります。)
もしもモニターの状況が「低下」になっている方は次の解決法を試してください。
正常性プローブは証明書の検証をスルーさせる
クライアント証明書なしでもアクセスしていいファイルやapiを用意します。
私の場合は/Homeにしました。
Web Service>構成>全般設定
証明書の除外パスに/Homeを設定します。
次に正常性プローブ先を/Homeに設定します。
trafficmanager>構成
パスに/Homeを設定
最後にコード側で/Homeのリクエストは証明書の検証をスルーさせます。
HttpContext context = HttpContext.Current;
HttpRequest httpRequest = context.Request;
// Homeは証明書の検証をスルー
if (httpRequest.Path != "/Home")
{
// 私のソースでいうところの検証処理関数
ClientCertificateUtility.Validate();
}
これでデプロイすればモニターの状況が正常にオンラインになるはず!