api 值未硬编码时管理客户端证书身份验证失败

api management client certificate authentication fails when values are not hard coded

我正在 API 管理组件上设置客户端身份验证。我希望客户端在可以访问任何 API 之前对我的 API 管理进行身份验证(因此 API 管理是服务器,API 用户是客户端,而不是后端服务的客户端身份验证)

根据 Microsoft 的说法,我可以做到这一点 (https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-mutual-certificates-for-clients)。但是,当我尝试根据我上传的所有受信任证书验证我的证书指纹时,由于客户端证书无效,验证失败。我使用了与 Microsoft 提供的相同的策略代码:

<choose>
    <when condition="@(context.Request.Certificate == null || !context.Deployment.Certificates.Any(c => c.Value.Thumbprint == context.Request.Certificate.Thumbprint))" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

现在当我使用硬编码指纹检查时,它成功了:

<choose>
    <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-thumbprint")" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

我将我的客户端证书上传到 CA 证书。我无法将其上传到 API 管理的客户端证书中,因为我没有私钥。只有客户才会拥有它们,并且他们只会发送他们的 public 证书,这样我就可以在我信任他们时将其上传到我的 API 管理实例中。

我认为检查所有证书的策略可能有误,它可能只检查我的客户端证书中的证书。这个对吗?如果是这样,是否可以检查我上传到 API 管理的所有 ca 证书?

这仅在您将其上传到客户端证书时有效。 context.Deployment.Certificates 是客户端证书集合。我知道这可能看起来 counter-intuitive,这是因为 context.Deployment.Certificates 不应该完全那样使用​​。它持有 APIM 用来向后端验证自身的证书,因此需要提供私钥。

如果您无法访问您的客户端证书的私钥,并且所有这些私钥都是由少数 CA/Root 个证书颁发的,请考虑上传 CA/root 个证书并使用 context.Request.Certificate.Verify验证链。