练习 - 使用客户端证书来保护对 API 的访问

已完成

通过使用入站策略,可将 API 管理配置为接受客户端证书。

假设气象公司决定通过对某些客户端的证书身份验证来保护其 API 的安全,这些客户端已经在其他系统中使用了证书身份验证。 此设置将允许这些客户端使用现有证书自行对 API 管理网关进行身份验证。

在本单元中,你将学习以下内容:

  • 创建自签名证书
  • 配置网关以请求客户端证书
  • 获取证书的指纹
  • 编辑入站策略,仅允许在其请求中使用具有指定证书的客户端
  • 使用 curl 调用 API 管理网关并传递证书

注意

本练习将使用你在上一练习中设置的资源。

创建自签名证书

首先,使用 Cloud Shell 创建自签名证书,该证书将用于在客户端和 API 管理网关之间进行身份验证。

  1. 若要创建私钥和证书,请在 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
    

    为使此示例易于理解,以上命令包括用于保护私钥的密码。 每当生成供自己使用的私钥时,请确保生成安全密码并适当地控制对其的访问。

  2. 通过运行以下命令,现将证书转换为 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 管理,因此必须将网关配置为接受客户端证书。 请执行以下步骤。

  1. 从已打开的 Azure 门户中,选择“API 管理服务(apim-WeatherDataNNNN)”。

  2. 在左侧菜窗格中的“部署和基础结构”下,选择“自定义域”。 此时将显示 API 管理服务的“自定义域”窗格。

  3. 对于*“请求客户端证书”,选择“是”,然后在顶部菜单栏中选择“保存”。

    配置网关以请求证书。

获取证书的指纹

在此部分中,你将配置 API 管理,使其仅在请求包含带特定指纹的证书时才接受请求。 让我们从证书中获取指纹。

注意

SSL 证书指纹也称为 SSL 证书指纹。

  1. 在 Cloud Shell 中运行以下代码。

    Fingerprint="$(openssl x509 -in selfsigncert.pem -noout -fingerprint)"
    Fingerprint="${Fingerprint//:}"
    echo ${Fingerprint#*=}
    
  2. 复制完整的输出(十六进制字符串)并将该指纹值粘贴到文本文件中。

编辑入站策略,仅允许具有有效证书的请求

现在,在 API 管理网关中创建身份验证策略。

  1. 在 Azure 门户中,选择你的 API 管理服务。 如有必要,在 Azure 资源菜单中或从“主页”,选择“所有资源”,然后选择“API 管理服务”。

  2. 在左侧菜单窗格中的“API”下,选择“API”。 此时将显示 API 管理服务的“API”窗格。

  3. 在二级菜单中,选择“天气数据”。

  4. 在“入站处理”框中,选择“</>”图标,打开“策略代码编辑器”。 将显示策略节点的 HTML 代码。

    “入站处理”策略按钮。

  5. 将策略文件的 <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>
    
  6. 选择“保存”。

调用网关并传递客户端证书

现在,可以在具有和不具有证书的情况下测试新的身份验证策略。

  1. 若要在没有证书的情况下测试 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 客户端证书错误,并且不会返回任何数据。

  2. 在 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}