【Microsoft Azure】API Managementでクライアント証明書 認証を行う

こんばんは。今日は、API Managementでクライアント認証を行えるようにする方法で記事にまとめておこうと思います。

今回の記事は、以下の公式ドキュメントを参考にしています。

https://docs.microsoft.com/ja-jp/azure/api-management/api-management-howto-mutual-certificates-for-clients

API Managementリソースを作成する

最初はAPI Managementリソースの作成です。この段階での設定は特に規定値から変更する必要はないのですが、1点、テストの目的では価格プランは従量課金がおすすめです。従量課金以外のプランの場合、各種設定変更を行う際に、都度プロビジョニングのために数十分程度の時間を要してしまうためです。

(私も従量課金に後ほど作り直したので、以降のリソース名とは異なります)

API ManagementのバックエンドにAPIを追加する

次は、API ManagementのバックエンドにAPIを追加します。今回は、Azure Functionsで作成したAPIを追加することにします。

Azure Functionsのリソースがなければ、作成します。ここも特に設定は規定値のままでよいかと思いますが、ポータルから関数追加が行えるWindowsランタイムの方が簡単、というくらいでしょうか。

関数アプリリソースを作成したら、関数を作成しておきます。規定値のHTTPトリガー関数が一つあればOKです。

関数を作成したら、これらをAPI Managementに登録します。

HTTPトリガーが一つあればよいので、一つだけ登録しておきます。

連携が完了しました。

次に、”製品”にこのAPIを登録し、公開します。

サブスクリプションを作成し、APIキーを取得します。

キーが発行できたら、まずはこの段階で疎通テストを実施しておきます。APIの疎通にはPostmanを使います。

ヘッダのOcp-Apim-Subscription-KeyにサブスクリプションKeyをセットし、実行。200応答が返ってくることを確認できればOKです。

クライアント証明書認証を有効化する

続けて、クライアント証明書認証を有効化します。

「カスタムドメイン」より、証明書認証を有効化できます。

従量課金プランの場合、この変更は数十秒程度で完了しました。この状態で、もう一度Postmanからリクエストを投げてみます。今度は403エラーが返りました。想定通りです!

クライアント証明書の検証ポリシーを構成する

それでは、クライアント認証の検証ポリシーを設定して、特定の証明書の場合はAPIを呼び出せるように変更したいと思います。

検証ポリシーの設定方法も以下に説明があります。

https://docs.microsoft.com/ja-jp/azure/api-management/api-management-howto-mutual-certificates-for-clients#policy-to-validate-client-certificates

今回は、簡単のため、証明書のフィンガープリントを検証するポリシーを追加したいと思います。

一点、ここで指定するフィンガープリントはすべて大文字である必要がありますので、ご注意ください。

<choose>
  <when condition="@(context.Request.Certificate.Thumbprint!="フィンガープリント")">
      <return-response>
         <set-status code="403" reason="Invalid client certificate" />
      </return-response>
  </when>
</choose>

これで、必要な事前設定は終了です!

クライアント認証のテスト

POSTMANからのテスト

必要な設定が完了したので、いよいよクライアント認証のテストです。

Postmanにクライアント証明書の設定を行います。

その上で、APIをコールすると・・・

通りました!

cURLからのテスト(うまくいかなかった)

デバイスに既にクライアント証明書をインストールしている場合には、なぜかクライアント証明書を明示的にセットしていなくても以下コマンドでリクエストが通ってしまいました。(そういうものなのかな・・?)

curl --location --header "Host: <APIMリソース名>.azure-api.net" --header "Ocp-Apim-Subscription-Key: xxxx" --header "Content-Length: 0" --request POST "https://<APIMリソース名>.azure-api.net/SampleFunctionsNetCore014/HttpTrigger1"

テストのため、ローカルデバイスのWindows証明書ストアにインストールしていたクライアント証明書を削除の上同じコマンドをたたくと、ちゃんと401ではじかれました。

< Cache-Control: private
< Date: Thu, 23 Sep 2021 13:14:23 GMT
< Content-Length: 0
<
* Connection #0 to host apimtest015.azure-api.net left intact

というわけで、改めて証明書を指定してリクエストを送ってみます。先ほどのcURLコマンドに-eオプションを追加します。が、動かない。いろいろ調べてみると、どうやら-eオプションで指定した証明書ではなく、証明書ストアにインストールされている別の証明書がデフォルトで使用されている模様。cURLのドキュメントあさってみたけど特に言及見つけられず・・・

うまくいったらまた更新しようと思います。。

と、最後未解決の点が残っていますが、以上、API Managementでクライアント証明書を行えるようにする方法のご紹介でした!

ご参考になりましたら幸いです。本記事が少しでもお役に立ちましたら、いいねボタンをぽちっていただけると励みになります。

おしまい

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US

Yuu113
初めまして。Yuu113と申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。