将管理证书与azure REST API一起使用

时间:2014-09-30 16:40:57

标签: azure azure-management-api

我在我的应用程序中使用azure服务管理REST API。我在azure上传了管理证书,并在当地有一份副本。 我将认证保存在应用程序本身的单独文件夹(AzureCertificate)中并引用该位置。 e.g:

  

string certificatePath = Server.MapPath("〜/ AzureCertificate /")+   certificateName;

     

X509Certificate2 certificate = new X509Certificate2(certificatePath);

     

AzureCertificate - 文件夹名称certificateName -   MyCertificatieName.cer

当我运行应用程序我的本地开发环境时,它工作正常。但是当我在azure网站上部署相同的错误时,我收到了以下错误。

  

远程服务器返回错误:(403)禁止

这是我提出请求的方式

  

string uri = apiURL + subscriptionId +" / services / hostedservices";

     

HttpWebRequest req =(HttpWebRequest)HttpWebRequest.Create(uri);

     

X509Certificate2 certificate = new X509Certificate2(certificatePath);

     

req.ClientCertificates.Add(证书);

     

req.Headers.Add(" x-ms-version"," 2009-10-01"); HttpWebResponse res =

     

(HttpWebResponse)req.GetResponse();

但它会在最后一行抛出上述异常(req.GetResponse())。

我们可以这样使用管理证书吗?

我的要求是开发一个使用azure REST API并在azure中部署的应用程序。

2 个答案:

答案 0 :(得分:1)

我还发现,使用Management API正确创建证书非常重要 - 在我使用此脚本创建证书之前,我收到了403错误:

makecert -r -pe -a sha1 -n "CN=Windows Azure Authentication Certificate" -ss my -len 2048 -sp "Microsoft Enhanced RSA and AES Cryptographic Provider" -sy 24 ManagementApiCert.cer

我在这里得到了:http://blogs.msdn.com/b/davidhardin/archive/2013/08/27/azure-management-certificate-public-key-private-key.aspx这已经有几年了,但是当我试过的其他更新的那些没有为我工作时。

此外,请确保您在门户网站的“设置”中的“管理证书”下上载证书,它不是SSL或远程访问证书。

答案 1 :(得分:0)

我建议使用Azure管理SDK。您可以从名为 Microsoft.WindowsAzure.Management 的nuget包安装它,并使用适当的类/方法来执行您想要执行的操作。

如果你 需要通过HTTP和REST API直接做某事,我建议使用HttpClient而不是HttpWebRequest。 (HttpClient是另一个名为 Microsoft.Net.Http 的nuget包。然后您可以使用SubscriptionCloudCredntials(通过ManagementClient.Credentials属性)为您填充HTTP请求例如:

var client = new ManagementClient(
    new CertificateCloudCredentials(subscriptionId, certificate));
//...
var requestMessage = new HttpRequestMessage(HttpMethod.Get, apiURL);
await client.Credentials.ProcessHttpRequestAsync(requestMessage,
    CancellationToken.None);
var httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.SendAsync(requestMessage);
// TODO: process response, maybe:
var responseText = response.AsString();

我建议您尽可能使用client