Azure API 管理 - 验证传入的客户端证书并将证书发送到后端
Azure API Management - Validate incoming client certificate and Send cert to backend
在 Azure API 管理中,我试图能够验证来自调用应用程序的传入证书以及将证书发送到后端。我也在尝试使用 Azure Keyvault Certs 来执行此操作。我可以独立完成其中任何一项,但很难让它们协同工作。
基本上我想从 Keyvault 获取一个证书,确保传入的证书匹配,然后将该相同的证书发送到后端以进行端到端证书验证。通过使用下面的入站策略,我可以从 keyvault 获取证书并将其发送到我的后端。我还可以获得传入证书的缩略图。
我遇到问题的地方是从我从密钥库获得的证书的 base64 字符串中获取指纹。无论如何我可以将证书字符串转换为证书对象吗?
<inbound>
<base />
<send-request mode="new" response-variable-name="keyVaultCertResponse" timeout="20" ignore-error="false">
<set-url>https://MYKEYVAULTNAME.vault.azure.net/secrets/CLIENTCERTTEST/?api-version=2016-10-01</set-url>
<set-method>GET</set-method>
<authentication-managed-identity resource="https://vault.azure.net" />
</send-request>
<set-variable name="keyVaultCertBase64" value="@(((IResponse)context.Variables["keyVaultCertResponse"]).Body.As<JObject>()["value"].ToString())" />
<choose>
<when condition="@(context.Request.Certificate == null)">
<return-response>
<set-status code="403" reason="No Client Certificate Provided to APIM" />
</return-response>
</when>
<when condition="@(context.Variables["keyVaultCertResponse"] != context.Request.Certificate.Thumbprint)">
<return-response>
<set-status code="403" reason="Client Certificate Presented to APIM is incorrect" />
</return-response>
</when>
</choose>
<authentication-certificate body="@(Convert.FromBase64String((string)context.Variables["keyVaultCertBase64"]))" />
</inbound>
在您的第二个 when
中,您正在比较 keyVaultCertResponse
,这是 IResponse
对象与客户端证书的指纹。如果您愿意通过指纹比较它们,请尝试实例化 X509Certificate2
对象并从中获取指纹。像这样:
new X509Certificate2(Convert.FromBase64String((string)context.Variables["keyVaultBase64"])). Thumbprint == context.Request.Certiricate.Thumbprint
在 Azure API 管理中,我试图能够验证来自调用应用程序的传入证书以及将证书发送到后端。我也在尝试使用 Azure Keyvault Certs 来执行此操作。我可以独立完成其中任何一项,但很难让它们协同工作。
基本上我想从 Keyvault 获取一个证书,确保传入的证书匹配,然后将该相同的证书发送到后端以进行端到端证书验证。通过使用下面的入站策略,我可以从 keyvault 获取证书并将其发送到我的后端。我还可以获得传入证书的缩略图。
我遇到问题的地方是从我从密钥库获得的证书的 base64 字符串中获取指纹。无论如何我可以将证书字符串转换为证书对象吗?
<inbound>
<base />
<send-request mode="new" response-variable-name="keyVaultCertResponse" timeout="20" ignore-error="false">
<set-url>https://MYKEYVAULTNAME.vault.azure.net/secrets/CLIENTCERTTEST/?api-version=2016-10-01</set-url>
<set-method>GET</set-method>
<authentication-managed-identity resource="https://vault.azure.net" />
</send-request>
<set-variable name="keyVaultCertBase64" value="@(((IResponse)context.Variables["keyVaultCertResponse"]).Body.As<JObject>()["value"].ToString())" />
<choose>
<when condition="@(context.Request.Certificate == null)">
<return-response>
<set-status code="403" reason="No Client Certificate Provided to APIM" />
</return-response>
</when>
<when condition="@(context.Variables["keyVaultCertResponse"] != context.Request.Certificate.Thumbprint)">
<return-response>
<set-status code="403" reason="Client Certificate Presented to APIM is incorrect" />
</return-response>
</when>
</choose>
<authentication-certificate body="@(Convert.FromBase64String((string)context.Variables["keyVaultCertBase64"]))" />
</inbound>
在您的第二个 when
中,您正在比较 keyVaultCertResponse
,这是 IResponse
对象与客户端证书的指纹。如果您愿意通过指纹比较它们,请尝试实例化 X509Certificate2
对象并从中获取指纹。像这样:
new X509Certificate2(Convert.FromBase64String((string)context.Variables["keyVaultBase64"])). Thumbprint == context.Request.Certiricate.Thumbprint