29

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

问题:有谁知道“指定的网络密码不正确”异常的原因是什么?

4

7 回答 7

35

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

学过的知识...

  • .cer 文件是二进制形式的 X.509 证书。它们是DER 编码的。
  • .pfx 文件是容器文件。也是DER编码的。它们不仅包含证书,还包含加密形式的私钥。
于 2009-05-22T21:21:04.903 回答
11

您可能需要X509Certificate2()使用参数 ofX509KeyStorageFlags.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://stackoverflow.com/a/8291956/130352

于 2015-01-29T10:36:49.150 回答
7

根据您的情况,您可能需要先在服务器上安装证书以提高信任级别,然后再导出.cer文件。

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

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

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

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

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

    授予帐户的私钥访问权限:

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

这就是我通过证书的方式,但不确定你需要用你的证书做什么,所以这对你来说可能不一样。

于 2009-05-22T21:47:11.747 回答
6

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

于 2010-05-11T23:19:47.493 回答
4

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

指定的网络密码不正确

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

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

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

_certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate",  X509KeyStorageFlags.MachineKeySet);
于 2015-09-29T00:08:09.740 回答
1

您可能需要 X509KeyStorageFlags.MachineKeySet。

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

于 2017-05-30T11:28:41.393 回答
0

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

于 2018-09-06T09:14:25.853 回答