2011-04-12 88 views
3

我试图在C#测试控制台应用程序中使用X509Certificate2类在本地计算机(Win Server 2003)上安装证书。当我安装证书用下面的代码,一切都很好:从.pfx文件安装证书时遇到问题

var serviceRuntimeMachineCertificateStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine); 
serviceRuntimeMachineCertificateStore.Open(OpenFlags.ReadWrite); 
cert = new X509Certificate2(certificatePath); 
serviceRuntimeMachineCertificateStore.Add(cert); 
serviceRuntimeMachineCertificateStore.Close(); 

问题是,证书的私钥不持久,当没有安装X509KeyStorageFlags.PersistKeySet。所以,我试图实例化这样的证书(私钥没有密码,所以我传递一个空字符串):

var serviceRuntimeMachineCertificateStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine); 
serviceRuntimeMachineCertificateStore.Open(OpenFlags.ReadWrite); 
cert = new X509Certificate2(certificatePath, "", X509KeyStorageFlags.PersistKeySet); 
serviceRuntimeMachineCertificateStore.Add(cert); 
serviceRuntimeMachineCertificateStore.Close(); 

但试图实例化证书抛出一个System.Security.Cryptography.CryptographicException“失败加载证书:指定的网络密码不正确“,即使私钥没有密码。

如果我在Microsoft管理控制台中导入证书而未指定密码,则效果很好。

有没有人知道如何以编程方式做到这一点?

回答

0

在任何情况下,我已经有类似的问题,也有类似的问题:我设法安装证书并以另一种方式持久保存私钥。我发现了WinHttpCertCfg命令行工具,您可以从这里获得:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winhttp/http/winhttpcertcfg_exe__a_certificate_configuration_tool.asp

然后我以编程方式调用此命令行工具来安装证书。这个网站给了我如何使用它的提示:weblogs.asp.net/hernandl/archive/2005/02/09/…

干杯,克里斯

0

你是从工作进程还是其他模拟进程执行它?可能只是您的流程使用的身份是在未加载身份用户的配置文件的情况下初始化的,似乎导致无法访问用户的CERTIFICATION商店。

加载带有私钥的一个X509证书从ASP.Net/IIS理线之内时,并打开配置文件加载的工人加工的伎俩

3

如果您尝试在Windows XP或Windows 2003的空口令创建X509Certificate2实例,“无法加载证书:指定的网络密码不正确。“异常将被抛出。

如果可以,请尝试创建一个密码不为空的证书。那么一切都应该没问题。

+0

我在Windows XP SP3上遇到了同样的问题,可以修复它被我们不带密码的X509Certificate2构造函数版本 – NineBerry 2013-12-12 15:29:14

0

希望这会帮助别人(以及对uGeeen的回答扩大:

User "S C"指出了在Windows XP和Windows Server证书的密码以下要求2003年

0 < password.Length < 32 

我看到矛盾的报告关于是否允许32,我可以确认我使用的是32字符的密码(一个MD5哈希),并将其截断为30个字符,修正了问题