我正在尝试使用C#测试控制台应用程序中的X509Certificate2类在我的本地计算机(Win Server 2003)上安装证书。当我使用以下代码安装证书时,一切都很好:
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 :(得分:3)
如果您尝试在Windows XP或Windows 2003上使用空密码创建X509Certificate2实例,则“无法加载证书:指定的网络密码不正确”。异常将被抛出。
如果可以,请尝试使用非空密码创建证书。那一切都应该没问题。
答案 1 :(得分:1)
希望这会对某人有所帮助(并扩展uGeeen的回答:
User "S C"指出了Windows XP和Windows Server 2003上的证书密码的以下要求。
0 < password.Length < 32
我看到有关32是否被允许的相互矛盾的报道。我可以确认我使用的是32个字符的密码(MD5哈希),并将其截断为30个字符来解决问题。
答案 2 :(得分:0)
你是从工作流程还是其他一些模拟过程中做到的?可能只是您的流程使用的身份被初始化而没有加载身份用户的个人资料,似乎导致无法访问用户的证书存储。
我在使用ASP.Net/IIS流程中的私钥加载x509证书时遇到了类似的问题,并且为处理的工作人员启用了配置文件加载功能
答案 3 :(得分: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/…
干杯,克里斯