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验证链。
我正在 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验证链。