2011-02-15 112 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