【问题标题】:MS Azure Resource Provider SDK - AuthenticationMS Azure 资源提供程序 SDK - 身份验证
【发布时间】:2015-08-08 03:56:15
【问题描述】:

我正在尝试实施此处描述的 MS Azure 身份验证: https://github.com/Azure/azure-resource-provider-sdk/tree/master/docs#authentication 但唯一说明的是:

您有责任验证调用者的证书指纹。 只接受来自具有正确公钥的证书的调用。

如何制作?最好在 PHP 中。提前致谢。

【问题讨论】:

  • 我尝试使用 PHP openssl_verify() 验证响应,但我需要 $signature,我不知道,我认为这不是要完成的方法。然后尝试使用我的私钥/公钥进行 Apache 服务器设置以模仿从 MS Azure 发送的请求,但不走运。还查看了 $_SERVER 变量中的任何签名线索或其他 ssl 变量 - 没有。

标签: php authentication azure certificate


【解决方案1】:

据我了解,资源提供程序 (RP) API 是 HTTP RESTful,这是 Azure 用来调用您的 RP 的证书:https://github.com/Azure/azure-resource-provider-sdk/blob/master/docs/misc/AzureStoreLatest.cer。要实现https://github.com/Azure/azure-resource-provider-sdk/tree/master/docs#authentication 中提到的您的 RP 身份验证,您可以利用验证从请求发送到您的 RP 的证书。根据我的经验,通常我们检查证书的序列号或指纹来验证其授权,在https://github.com/Azure/azure-resource-provider-sdk/tree/master/samples 发布的官方样本使用相同的方式进行证书验证。例如。下面是一个 C# 版本的 AuthorizeRequest 供您参考:

    public static bool AuthorizeRequest(X509Certificate2 clientCertificate)
    {
        if (ConfigurationDataProvider.AzureStoreRequestAuthorization)
        {
            if (clientCertificate == null || (
                // BaltimoreRdfeExtensibilityClientProd.cer, will expire on Saturday, February 14, 2015
                !clientCertificate.Thumbprint.Equals("F2693F8487AB975A28C19610A672E59DDCF873F2", StringComparison.OrdinalIgnoreCase) &&

                // BaltimoreRdfeExtensibilityClientStage.cer, will expire on Saturday, February 14, 2015
                !clientCertificate.Thumbprint.Equals("19D02B07DEC22C0998BB266A7DA5BA8B4D42A0A6", StringComparison.OrdinalIgnoreCase)
            ))
            {
                Logger.ErrorFormat(
                    format  : "Unauthorized access to Azure Store integration endpoints: {0}, {1}", 
                    arg0    : clientCertificate != null ? clientCertificate.Subject     : "<null>",
                    arg1    : clientCertificate != null ? clientCertificate.Thumbprint  : "<null>"
                );

                return false;
            }
        }

        return true;
    }

在 PHP & OpenSSL 中,我们可以利用 SSL_CLIENT_M_SERIAL 变量:http://pilif.github.io/2013/07/how-to-accept-ssl-client-certificates/ 来获取客户端证书的序列号,然后检查该值是否等于 AzureStoreLatest.cer 的序列号。 (您可以在代码中硬编码序列号,就像上面的 C# 示例一样)

我想指出一些使用 RP API 的概念和技巧:

https://github.com/Azure/azure-resource-provider-sdk/blob/master/docs/concepts.md

https://github.com/Azure/azure-resource-provider-sdk/blob/master/docs/tips-and-tricks.md

如果您在实施过程中还有任何疑虑,请随时告诉我们并提供有关您尝试过的方法的更多信息。

【讨论】:

    猜你喜欢
    • 2017-12-25
    • 2015-08-24
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多