我正在尝试在Web角色中枚举来自Azure的证书(在v1.3 Azure SDK Dev Fabric上运行),但在使用以下代码时不会返回任何证书。但是,重要的是要注意,从控制台程序运行时代码可以正常工作:
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 :(得分:0)
将X509证书存储在LocalMachine中而不是CurrentUser中。 IIS进程的CurrentUser在您可能无权访问的IIS用户的上下文中运行。 此外,您还要确保已通过远程处理和验证将Azure上的证书正确导入证书存储区。
答案 1 :(得分:0)
您应远程(RDP)加入角色并检查商店。老实说,我不知道Azure门户网站上传证书的位置,但我认为它是CurrentUser(我认为IIS也可以运行)。
您还可以通过Service Management API枚举证书,这可能适用于您的解决方案,也可能不适用于您的解决方案。 http://msdn.microsoft.com/en-us/library/ee795178.aspx
答案 2 :(得分: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);
}
}
}
关键的洞察力是我需要在我的服务中存储密码才能从证书存储区加载证书,因此我将它保存在商店中并没有获得任何安全优势。