練習 - 使用用戶端憑證來保護對 API 的存取
您可以將 API 管理設定為使用輸入原則接受用戶端憑證。
假設您的天氣公司已決定透過憑證驗證來保護其 API,供給已在其他系統中使用憑證驗證的特定用戶端使用。 此設定可讓這些用戶端使用現有的憑證,對 API 管理閘道進行驗證。
在本單元中,您將會:
- 建立自我簽署憑證
- 設定閘道以要求用戶端憑證
- 取得憑證的指紋
- 編輯輸入原則,以僅允許在其要求中具有指定憑證的用戶端
- 呼叫 API 管理閘道,並使用
curl
傳遞憑證
注意
此練習會使用您在上一個練習中設定的資源。
建立自我簽署憑證
首先,使用 Cloud Shell 來建立自我簽署憑證,您將使用該憑證,在用戶端與 API 管理閘道之間進行驗證。
若要建立私密金鑰與憑證,請在 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 管理的使用量層,因此必須將閘道設定為接受用戶端憑證。 請遵循下列步驟。
從已開啟的 Azure 入口網站中,選取您的 API 管理服務 (apim-WeatherDataNNNN)。
在左側功能表窗格的 [部署和基礎結構] 下方,選取 [自訂網域]。 API 管理服務的 [自訂網域] 窗格隨即出現。
針對 *[要求用戶端憑證],選取 [是],然後在頂端功能表列上選取 [儲存]。
取得憑證的指紋
在此節中,您將設定 API 管理僅在憑證具有特定指模 (指紋) 時才接受要求。 讓我們從憑證中取得該指紋。
注意
SSL 憑證指模也稱為 SSL 憑證指紋。
在 Cloud Shell 中,執行下列程式碼。
Fingerprint="$(openssl x509 -in selfsigncert.pem -noout -fingerprint)" Fingerprint="${Fingerprint//:}" echo ${Fingerprint#*=}
複製完整的輸出 (十六進位字串),然後將這個指紋值貼到文字檔中。
編輯輸入原則,以僅允許使用有效憑證的要求
現在,在 APIM 管理閘道內建立驗證原則。
在 Azure 入口網站中,選取您的 API 管理服務。 視需要在 Azure 資源功能表中,或從 [首頁] 頁面,選取 [所有資源],然後選取您的 API 管理服務。
在左側功能表窗格的 [API] 下方,選取 [API]。 API 管理服務的 [API] 窗格隨即出現。
在次要功能表,選取 [天氣資料]。
在 [輸入處理] 方塊中 ,選取 </> 圖示以開啟 [原則程式碼編輯器]。 原則節點的 HTML 程式碼隨即顯示。
使用下列 XML 取代原則檔案的
<inbound>
節點,並替代您先前為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 管理服務的 [訂用帳戶] 窗格取得此主要金鑰)。 請記得包含您的 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}