X509Certificate.CreateFromCertFile – 指定的网络密码不正确

我有一个.NET应用程序,我想用它作为客户端来调用SSL SOAP Web服务。 我已经获得了一个名为foo.pfx的有效客户端证书。 证书本身有密码。

我已将证书放在以下位置: C:\certs\foo.pfx

要调用Web服务,我需要附加客户端证书。 这是代码:

 public X509Certificate GetCertificateFromDisk(){ try{ string certPath = ConfigurationManager.AppSettings["MyCertPath"].ToString(); //this evaluates to "c:\\certs\\foo.pfx". So far so good. X509Certificate myCert = X509Certificate.CreateFromCertFile(certPath); // exception is raised here! "The specified network password is not correct" return cert; } catch (Exception ex){ throw; } } 

听起来像是试图读取磁盘的.NET应用程序的例外。 CreateFromCertFile方法是一个静态方法,应该创建X509Certificate的新实例。 该方法未被覆盖,并且只有一个参数:路径。

当我检查exception时,我发现:

 _COMPlusExceptionCode = -532459699 Source=mscorlib 

问题:有没有人知道exception的原因“指定的网络密码不正确”?

事实certificate我试图从.pfx而不是.cer文件创建证书。

学过的知识…

  • .cer文件是二进制forms的X.509证书。 它们是DER编码的 。
  • .pfx文件是容器文件 。 DER编码。 它们不仅包含证书,还包含加密forms的私钥。

您可能需要使用参数X509KeyStorageFlags.MachineKeySet来使用X509Certificate2() 。 这解决了我们遇到的类似问题。 感谢建议的原始网站: http : //vdachev.net/2012/03/07/c-sharp-error-creating-x509certificate2-from-a-pfx-or-p12-file-in-production/

引用:

原因

问题的原因似乎与错误消息没有多大关系。 由于某种原因,构造函数试图访问私钥存储,尽管私钥存储在正在打开的文件中。 默认情况下使用用户密钥库,但不允许ASP.NET(通常可能是非交互式Windows服务)打开它。 有可能是所选帐户的用户密钥库甚至不存在。

您可以尝试的一件事是通过登录帐户并在其个人存储中导入证书(然后再次将其删除)来创建用户密钥库。

另一种解决方案是将另一个参数传递给构造函数 – 指示私钥(应该)存储在本地计算机中的标志 – X509KeyStorageFlags.MachineKeySet,如下所示: var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

对于没有密码的PFX,可以将password指定为string.Empty

另请参见https://stackoverflow.com/a/8291956/130352

根据您的具体情况,您可能需要首先在服务器上安装证书,以便在导出.cer文件之前获得信任级别。

我必须为一个类似的项目做这个,这里是关于它是如何完成的笔记。

Foo.cer替换为服务器上安装的证书的导出。 (从pfx文件安装证书,然后将其导出到cer文件。)

  • IIS6的命令允许IIS_WPG组访问cert密钥。 需要安装winhttpcertcfg (你可以点击下面的链接来获取你自己的副本)。

    C:\ Program Files \ Windows资源工具包\工具> winhttpcertcfg -i(pfx文件的路径,例如.e:\ Certs \ Foo.pfx)-c LOCAL_MACHINE \ My -a IIS_WPG -p(pfx文件的密码)

  • 吐出关键信息并授予特权

    授予帐户私钥访问权限:

     (SERVERNAME)\IIS_WPG 

下载安装exe的WinHttpCertCfg.msi

有关如何使用cert配置的更多信息,请访问此处 。

然后它回到你如何进行证书推送。

 //Cert Challenge URL Uri requestURI = new Uri("https://someurl"); //Create the Request Object HttpWebRequest pageRequest = (HttpWebRequest)WebRequest.Create(requestURI); //After installing the cert on the server export a client cert to the working directory as Foo.cer string certFile = MapPath("Foo.cer"); X509Certificate cert = X509Certificate.CreateFromCertFile(certFile); //Set the Request Object parameters pageRequest.ContentType = "application/x-www-form-urlencoded"; pageRequest.Method = "POST"; pageRequest.AllowWriteStreamBuffering = false; pageRequest.AllowAutoRedirect = false; pageRequest.ClientCertificates.Add(cert); 

这是我如何通过证书,但不确定您需要对您的证书做什么,所以这可能与您不一样。

当您尝试在其中一个OS存储中导入的证书已存在于该存储中时,也会返回“指定的网络密码不正确”错误消息。

在我的情况下,我试图在私有应用程序模式下运行,我得到了同样的错误。

指定的网络密码不正确

PrivateAuthenticator构造函数(在Xero.Api.Example.Applications.Private )尝试导入证书,假设在创建证书期间没有定义密码。

 _certificate = new X509Certificate2(); _certificate.Import(certificatePath); 

然后我更改了导入以使用使用密码的重载方法,

 _certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate", X509KeyStorageFlags.MachineKeySet); 

您可能需要X509KeyStorageFlags.MachineKeySet。

我正在使用来自网络工作的证书。

在我的情况下,在应用程序池中将Identity更改为NetworkService解决了这个问题。