如果未对值进行硬编码,则api管理客户端证书认证会失败

时间:2019-05-13 10:28:05

标签: azure certificate client-certificates azure-api-management

我正在我的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管理的客户端证书中上传它。只有客户端会拥有它们,并且它们只会发送其公共证书,因此当我信任它们时,我可以将其上传到我的API管理实例中。

我认为检查所有证书的策略可能是错误的,并且可能仅检查我的客户证书中的证书。它是否正确?如果可以,是否可以检查我上传到API管理的所有ca证书?

2 个答案:

答案 0 :(得分:1)

仅在将其上传到客户端证书时才有效。 context.Deployment.Certificates是客户端证书集合。我知道这似乎是违反直觉的,这是因为context.Deployment.Certificates并非完全像这样使用。它拥有APIM用于向后端进行身份验证的证书,因此需要提供私钥。

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

答案 1 :(得分:0)

检查证书主题或指纹以验证用户不是使用PKI进行用户身份验证的好策略。相反,您可以考虑使用用户的私钥对AuthToken或UserID-Password或某些标头值进行加密,然后在服务器上,使用已经在服务器上注册的客户端/用户的公钥进行解密,然后将其加密,以验证过程。 >

也可以浏览一下您给定的docs.microsoft链接的“反馈”部分。。。有一些担忧或担忧。

请参阅我在帖子中的回答:https://stackoverflow.com/a/55757349/9659885 这将为您提供一种可能的方法或至少如何在客户端上签名/加密内容的思路。