我可以在ASP.NET中使用X509Certificate2而不使用证书存储吗?

我试图在Rackspace Cloud中的ASP.NET Web服务中使用X509Certificate。 我有一种感觉,云节点上的证书存储可能会导致问题。 我也有一个与此相关的问题,除了我在使用iPhone Apple推送通知提供程序(apns-sharp)C#时收到SslStream.AuthenticateAsClientexception

在apns-sharp项目中,我使用以下代码:

certificate = new X509Certificate2(p12File) 

但是我收到了一个exception并将代码更改为以下解决了X509Certificate2exception。 新代码如下:

 certificate = new X509Certificate2(p12File, String.Empty, X509KeyStorageFlags.MachineKeySet); 

我想知道我是否可以在ASP.NET中使用X509Certificate2而不使用证书存储? 证书存储是否会导致Rackspace Cloud节点出现问题?

更新#1 Rackspace告诉我不允许访问本地机器证书商店。 有没有其他方法可以绕过使用证书存储区? 也许使用第三方图书馆?

第一个构造函数不起作用的原因是ASP.NET不加载用户配置文件存储,如果未使用X509KeyStorageFlags指定存储位置,则该存储是默认存储。 但是,机器存储始终由ASP.NET加载,这就是第二个构造函数工作的原因。

我假设您打算使用证书上的私钥进行加密或创建数字签名(散列),在这种情况下,您无法避免使用证书存储,因为私钥只能通过编程方式从导入的证书访问,并且不是直接来自blob或文件。

如果证书数据只包含公钥,我认为不会使用证书存储(因为没有要保护的敏感数据) – 我注意到我只需要在我打算使用证书时指定机器存储包含私钥。

我无法评论Rackspace的情况 – 在部分受信任的环境中运行的代码中导入证书可能存在问题,因为加载私钥容器需要可能未授予程序集的特定权限。

我从一个文件导入了一个X509Certificate2,并使用以下代码提供了私钥和公钥:

  X509Certificate2 cert = new X509Certificate2(); // Key Location: the physical file location (C:\cert.pfx) // Key Password: the password for the certificate cert.Import(keyLocation, keyPassword, X509KeyStorageFlags.Exportable); 

我的经验是让它工作的关键是X509KeyStorageFlags.Exportable。 没有它,我无法访问私钥。