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

31
我有一个.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个回答

36

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

吸取了教训...

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

@p.campell,是否可以从本地目录上传.pfx证书并获取该证书的指纹? - drgmak

11
您可能需要使用 X509Certificate2() 构造函数并传入参数 X509KeyStorageFlags.MachineKeySet 来解决类似的问题。我们也是通过这种方式解决了类似的问题。这里鸣谢提供这个建议的原始网站: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,可以将密码指定为 string.Empty
另请参见https://dev59.com/s2sy5IYBdhLWcg3w1xeU#8291956

7
根据您的情况,您可能需要先在服务器上安装证书以提高信任级别,然后再导出 .cer 文件。我曾为一个类似的项目做过这个事情,以下是我的记录:
用在服务器上安装的证书的导出文件替换 Foo.cer。(安装从 pfx 文件中获取的证书,然后将其导出为 cer 文件。)
  • Command for IIS6 to allow IIS_WPG group access to the cert key. Need to install winhttpcertcfg (You can follow the link below to grab your own copy).

    C:\Program Files\Windows Resource Kits\Tools>winhttpcertcfg -i (Path to pfx file, eg. e:\Certs\Foo.pfx) -c LOCAL_MACHINE\My -a IIS_WPG -p (Password for pfx file)

  • Spits out key info and grants privilege

    Granting private key access for account:

      (SERVERNAME)\IIS_WPG
    

在这里下载安装WinHttpCertCfg.msi,这会安装exe文件。

如何使用证书配置的更多信息可以在这里找到。

然后,它只涉及如何进行证书推送的操作。

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

这是我通过认证的方法,但不确定你需要用证书做什么,所以可能对你没用。

6

当您尝试在操作系统存储之一中导入证书时,如果该证书已经存在于该存储中,则会返回“指定的网络密码不正确”错误消息。


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

指定的网络密码不正确

PrivateAuthenticator构造函数(位于中)尝试导入证书,假设在创建证书时没有定义密码。
_certificate = new X509Certificate2();
_certificate.Import(certificatePath);

然后我更改了导入方法,使用了一个重载方法,该方法使用密码。
_certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate",  X509KeyStorageFlags.MachineKeySet);

空构造函数和Import()函数现在已经被弃用。X509Certificate2现在是不可变的。 - undefined

1

您可能需要使用X509KeyStorageFlags.MachineKeySet。

我正在使用来自Web作业的证书。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接