gpt4 book ai didi

azure - 403 禁止从 Web 角色实例调用 Azure Rest api 时

转载 作者:行者123 更新时间:2023-12-04 23:22:43 25 4
gpt4 key购买 nike

我有一个非常奇怪的问题。我将 webrole 发布到 azure 云服务。在这个项目中,它需要 webrole 调用 Azure Rest API,我可以在本地模拟器中获得响应,但是,如果我将其发布到 Azure,我会收到 403 禁止错误。我确信我已将证书安装到 Azure。

可以通过以下步骤重现此错误:

  1. 首先创建一个证书,链接如下:http://msdn.microsoft.com/en-us/library/windowsazure/gg651127.aspx
  2. 使用 webrole 和 Azure 门户中的证书创建云服务,云服务证书和 webrole->property->certificate。
  3. 发布项目。
  4. 远程登录网络角色实例。
  5. 在本地创建一个控制台应用程序,然后将调试文件夹复制到远程实例并在远程应用程序中运行 exe。你可以发现应用程序在本地可以完美运行,但在Azure实例中,似乎可以找到证书,但仍然得到403禁止错误。

控制台应用程序代码:

static void Main(string[] args)
{
try
{
// X.509 certificate variables.
X509Store certStore = null;
X509Certificate2Collection certCollection = null;
X509Certificate2 certificate = null;

// Request and response variables.
HttpWebRequest httpWebRequest = null;
HttpWebResponse httpWebResponse = null;

// Stream variables.
Stream responseStream = null;
StreamReader reader = null;

// URI variable.
Uri requestUri = null;

// Specify operation to use for the service management call.
// This sample will use the operation for listing the hosted services.
string operation = "hostedservices";

// The ID for the Windows Azure subscription.
string subscriptionId = "";

// The thumbprint for the certificate. This certificate would have been
// previously added as a management certificate within the Windows Azure management portal.
string thumbPrint = "";

// Open the certificate store for the current user.
certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);

// Find the certificate with the specified thumbprint.
certCollection = certStore.Certificates.Find(
X509FindType.FindByThumbprint,
thumbPrint,
false);

// Close the certificate store.
certStore.Close();

// Check to see if a matching certificate was found.
if (0 == certCollection.Count)
{
throw new Exception("No certificate found containing thumbprint " + thumbPrint);
}

// A matching certificate was found.
certificate = certCollection[0];
Console.WriteLine("Using certificate with thumbprint: " + thumbPrint);

// Create the request.
requestUri = new Uri("https://management.core.windows.net/"
+ subscriptionId
+ "/services/"
+ operation);

httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(requestUri);

// Add the certificate to the request.
httpWebRequest.ClientCertificates.Add(certificate);

// Specify the version information in the header.
httpWebRequest.Headers.Add("x-ms-version", "2011-10-01");

// Make the call using the web request.
httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

// Display the web response status code.
Console.WriteLine("Response status code: " + httpWebResponse.StatusCode);

// Display the request ID returned by Windows Azure.
if (null != httpWebResponse.Headers)
{
Console.WriteLine("x-ms-request-id: "
+ httpWebResponse.Headers["x-ms-request-id"]);
}

// Parse the web response.
responseStream = httpWebResponse.GetResponseStream();
reader = new StreamReader(responseStream);
// Display the raw response.
Console.WriteLine("Response output:");
Console.WriteLine(reader.ReadToEnd());

// Close the resources no longer needed.
httpWebResponse.Close();
responseStream.Close();
reader.Close();
}
catch (Exception e)
{

Console.WriteLine("Error encountered: " + e.Message);

// Exit the application with exit code 1.
Console.ReadLine();
System.Environment.Exit(1);

}
finally
{
// Exit the application.
Console.ReadLine();
System.Environment.Exit(0);
}
}

最佳答案

我使用您提供的 azure create cert 链接遇到了同样的问题。我发现使用该方法创建证书时,私钥没有上传到云服务。即使服务能够找到证书,但在提交请求时仍然未经授权。

使用以下方法创建私钥和公钥证书是有效的。在 Visual Studio 命令提示符中,创建 .cer.pfx 文件:

makecert -r -pe -n "CN=AzureManage" -sky exchange "AzureManage.cer" -sv "AzureManage.pvk"
pvk2pfx -pvk "AzureManage.pvk" -spc "AzureManage.cer" -pfx "AzureManage.pfx" -pi password

第一个命令创建一个私钥和公钥文件。系统将多次提示您输入密码。第二个命令将两者组合成一个 pfx 文件。如果您关闭-pi密码,那么系统将提示您输入密码,而不是在终端中输入密码。

然后您需要适本地导入文件:

  • 使用 mmc 将 pfx 导入到本地计算机/个人证书存储中。
  • 将 pfx 上传到 Azure 云服务。
  • 将 cer 上传到 Azure 管理证书存储。
  • 将 pfx 的指纹添加到您的 Azure 角色证书属性。

然后您可以按如下方式使用 Azure 管理 REST API:

X509Certificate2 GetCertificate(string thumbprint)
{
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);

if (certs.Count == 0) return null;
var cert = certs[0];
store.Close();
return cert;
}

HttpWebRequest request = WebRequest.CreateHttp(apiUrl);
request.ClientCertificates.Add(cert);
request.Headers.Add("x-ms-version", "2012-03-01");

关于azure - 403 禁止从 Web 角色实例调用 Azure Rest api 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19850742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com