演習 - クライアント証明書を使用して、API へのアクセスをセキュリティで保護する
受信ポリシーを使用して、クライアント証明書を受け入れるように API Management を構成します。
あなたが働く気象会社が、他のシステムで既に証明書認証を使用している特定のクライアントについては、証明書認証を介してその API をセキュリティで保護することを決定したとします。 この設定により、クライアントは既存の証明書を使用して、API Management ゲートウェイに対して自身を認証することができるようになります。
このユニットでは、次のことを行います。
- 自己署名証明書を作成する
- クライアント証明書を要求するようにゲートウェイを構成する
- 証明書の拇印を取得する
- 要求で指定された証明書を持つクライアントのみを許可するように、受信ポリシーを編集する
curl
を使用して、API Management ゲートウェイを呼び出して証明書を渡す
Note
この演習では、前の演習で設定したリソースを使います。
自己署名証明書を作成
最初に、Cloud Shell を使用して自己署名証明書を作成します。これは、クライアントと API Management ゲートウェイ間の認証に使用します。
秘密キーと証明書を作成するには、Cloud Shell で次のコマンドを実行します。
pwd='<Enter a secure password here>' pfxFilePath='selfsigncert.pfx' openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out selfsigncert.crt -subj /CN=localhost
この例ではわかりやすくするために、上記のコマンドに、秘密キーをセキュリティで保護するために使用されるパスワードが含まれています。 ご自分で使用する秘密キーを生成する場合は必ず、セキュリティで保護されたパスワードを生成し、それに対するアクセス権を適切に制御するようにしてください。
ここで、次のコマンドを実行して、
curl
ツールで使用できる PEM 形式に証明書を変換します。openssl pkcs12 -export -out $pfxFilePath -inkey privateKey.key -in selfsigncert.crt -password pass:$pwd openssl pkcs12 -in selfsigncert.pfx -out selfsigncert.pem -nodes
メッセージが表示されたら、セキュリティで保護されたパスワードを入力して Enter キーを押します。
クライアント証明書を要求するようにゲートウェイを構成する
API Management の従量課金レベルを使用するため、クライアント証明書を受け入れるようにゲートウェイを構成する必要があります。 次の手順に従います。
既に開いている Azure portal から、API Management サービス (apim-WeatherDataNNNN) を選択します。
左側のメニュー ペインの [Deployment and infrastructure](デプロイとインフラストラクチャ) で、[カスタム ドメイン] を選択します。 API Management サービスの [カスタム ドメイン] ペインが表示されます。
*[クライアント証明書を要求する] で [はい] を選択し、上部のメニュー バーで [保存] を選択します。
証明書の拇印を取得する
このセクションでは、特定のサムプリント (フィンガープリント) を持つ証明書がある場合にのみ、要求を受け入れるように API Management を構成します。 証明書からその拇印を取得しましょう。
Note
SSL 証明書のサムプリントは、SSL 証明書のフィンガープリントとも呼ばれます。
Cloud Shell で次のコードを実行します。
Fingerprint="$(openssl x509 -in selfsigncert.pem -noout -fingerprint)" Fingerprint="${Fingerprint//:}" echo ${Fingerprint#*=}
完全な出力 (16 進数文字列) をコピーし、このフィンガープリント値をテキスト ファイルに貼り付けます。
証明書が有効な要求のみを許可するように受信ポリシーを編集する
次に、API Management ゲートウェイで認証ポリシーを作成します。
Azure portal で、API Management サービスを選択します。 必要に応じて、Azure リソース メニューまたは [ホーム] ページから [すべてのリソース] を選択し、API Management サービスを選択します。
左側のメニュー ペインの [API] で、[API] を選択します。 API Management サービスの [API] ペインが表示されます。
セカンダリ メニューで、Weather Data (気象データ) を選択します。
[受信処理] ボックスで、</> アイコンを選択して、ポリシー コード エディターを開きます。 ポリシー ノードの HTML コードが表示されます。
ポリシー ファイルの
<inbound>
ノードを次の XML に置き換え、desired-fingerprint
プレースホルダーを先ほどコピーしたフィンガープリントに置き換えます。<inbound> <choose> <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-fingerprint")" > <return-response> <set-status code="403" reason="Invalid client certificate" /> </return-response> </when> </choose> <base /> </inbound>
[保存] を選択します。
ゲートウェイを呼び出してクライアント証明書を渡す
ここで、証明書を使用して、または証明書なしで、新しい認証ポリシーをテストできます。
証明書を使用せずに API をテストするには、Cloud Shell で次のコマンドを実行し、プレースホルダーの値を API ゲートウェイ名とサブスクリプション キーに置き換えます。
curl -X -v GET https://[api-gateway-name].azure-api.net/api/Weather/53/-1 \ -H 'Ocp-Apim-Subscription-Key: [Subscription Key]'
このコマンドでは、403 クライアント証明書エラーが返されるはずです。データは返されません。
Cloud Shell で、証明書を使用して API をテストするには、最初の演習のプライマリ サブスクリプション キーを使用し、次の cURL コマンドをコピーして貼り付けます (このプライマリ キーは、WeatherData API Management サービスの [サブスクリプション] ペインから取得することもできます)。 API ゲートウェイ名を含める必要があります。
curl -X GET https://[api-gateway-name].azure-api.net/api/Weather/53/-1 \ -H 'Ocp-Apim-Subscription-Key: [subscription-key]' \ --cert-type pem \ --cert selfsigncert.pem
このコマンドを実行すると、正常な応答が返され、次のような気象データが表示されます。
{"mainOutlook":{"temperature":32,"humidity":34},"wind":{"speed":11,"direction":239.0},"date":"2019-05-16T00:00:00+00:00","latitude":53.0,"longitude":-1.0}