2011-02-15 115 views
2

我想在Web角色(在v1.3 Azure SDK开发结构上运行)中枚举来自Azure的证书,但在使用以下代码时没有返回证书。这是需要注意的重要的,但是,从一个控制台程序运行时代码工作正常:证书问题(安全相关?!?)

private static void EnumCerts() 
{ 
    var selectedCerts = new X509Certificate2Collection(); 

    var store = new X509Store(
     StoreName.My, StoreLocation.CurrentUser); 

    try 
    { 
     store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly); 

     foreach (X509Certificate2 cert in store.Certificates) 
      Console.WriteLine(cert.Subject); 
    } 
    finally 
    { 
     store.Close(); 
    } 
} 

我的工作假设是,这是由于安全问题。我的Web角色正在运行Elevated Trust,但我猜IIS Web实例不是。

在这两种情况下,我不知道如何解决这个问题,所以任何帮助,将不胜感激......

回答

0

我结束了在我的服务代码中嵌入的证书,然后从资源阅读它解决问题:

using System.IO; 
using System.Reflection; 
using System.Security.Cryptography.X509Certificates; 

namespace AcsTest.Shared 
{ 
    public static class CertHelper 
    { 
     public static X509Certificate2 GetCertFromManifest(
      Assembly assembly, string certName, string password) 
     { 
      byte[] bytes; 

      using (var stream = assembly. 
       GetManifestResourceStream(certName)) 
      { 
       bytes = new BinaryReader(stream). 
        ReadBytes((int)stream.Length); 
      } 

      return new X509Certificate2(bytes, password, 
       X509KeyStorageFlags.MachineKeySet); 
     } 
    } 
} 

的主要观点是我需要在我的服务存储密码从证书存储区加载证书,因此我没有通过将其保存在商店中而获得安全优势。

0

Store中LOCALMACHINE而不是CurrentUser的X509证书。 CurrentUser用于IIS进程,在您可能无法访问的IIS用户的上下文中运行。 此外,您还要确保已通过远程登录和验证将Azure一侧的证书正确导入证书存储区。

+0

感谢您的快速响应!我的印象是,天青只存储在CurrentUser存储证书(如http://blogs.msdn.com/b/jnak/archive/2010/01/29/installing-certificates-in-windows-azure-描述下vms.aspx)。我会上传一个实验网站来测试你的理论 – 2011-02-15 23:28:06

0

您应该远程(RDP)进入角色并检查商店。我真的不知道Azure门户上传证书的位置,但我认为它是CurrentUser(我认为IIS也运行于此)。

您还可以通过服务管理API枚举证书,该API可能适用于您的解决方案,也可能不适用。 http://msdn.microsoft.com/en-us/library/ee795178.aspx