练习 - 使用客户端证书来保护对 API 的访问
通过使用入站策略,可将 API 管理配置为接受客户端证书。
假设气象公司决定通过对某些客户端的证书身份验证来保护其 API 的安全,这些客户端已经在其他系统中使用了证书身份验证。 此设置将允许这些客户端使用现有证书自行对 API 管理网关进行身份验证。
在本单元中,你将学习以下内容:
- 创建自签名证书
- 配置网关以请求客户端证书
- 获取证书的指纹
- 编辑入站策略,仅允许在其请求中使用具有指定证书的客户端
- 使用
curl
调用 API 管理网关并传递证书
注意
本练习将使用你在上一练习中设置的资源。
创建自签名证书
首先,使用 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#*=}
复制完整的输出(十六进制字符串)并将该指纹值粘贴到文本文件中。
编辑入站策略,仅允许具有有效证书的请求
现在,在 API 管理网关中创建身份验证策略。
在 Azure 门户中,选择你的 API 管理服务。 如有必要,在 Azure 资源菜单中或从“主页”,选择“所有资源”,然后选择“API 管理服务”。
在左侧菜单窗格中的“API”下,选择“API”。 此时将显示 API 管理服务的“API”窗格。
在二级菜单中,选择“天气数据”。
在“入站处理”框中,选择“</>”图标,打开“策略代码编辑器”。 将显示策略节点的 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}