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

时间:2009-05-22 21:04:01

标签: c# ssl-certificate x509certificate

我有一个.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的新实例。该方法未被覆盖,并且只有一个参数:路径。

当我检查异常时,我发现了这个:

_COMPlusExceptionCode = -532459699
Source=mscorlib

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

7 个答案:

答案 0 :(得分:30)

原来我试图从.pfx而不是.cer文件创建证书。

经验教训......

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

答案 1 :(得分:10)

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

引用:

  

<强>原因

     

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

     

<强>解决方案

     

您可以尝试通过登录创建用户密钥库   帐户并在其个人商店中导入证书(和   然后再删除它。)

     

另一种解决方案是将另一个参数传递给构造函数    - 表示私钥(应该存储)的标志   本地计算机 - X509KeyStorageFlags.MachineKeySet,如下所示:X509KeyStorageFlags.MachineKeySet

对于没有密码的PFX,可以将密码指定为var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

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

答案 2 :(得分:7)

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

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

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

  • IIS6的命令,允许IIS_WPG组访问cert密钥。需要安装winhttpcertcfg(您可以按照以下链接获取自己的副本)。

      

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

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

    授予帐户私钥访问权限:

    (SERVERNAME)\IIS_WPG
    

下载安装exe的WinHttpCertCfg.msi here

有关如何使用证书配置的更多信息,请访问here

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

//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);

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

答案 3 :(得分:5)

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

答案 4 :(得分:3)

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

  

指定的网络密码不正确

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

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

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

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

答案 5 :(得分:1)

您可能需要X509KeyStorageFlags.MachineKeySet。

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

答案 6 :(得分:0)

在我的情况下,将Application Pool中的Identity更改为NetworkService可以解决此问题。