【问题标题】:X509Certificate.CreateFromCertFile - the specified network password is not correctX509Certificate.CreateFromCertFile - 指定的网络密码不正确
【发布时间】:2010-10-28 08:26:02
【问题描述】:

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

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

【问题讨论】:

    标签: c# ssl-certificate x509certificate


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可能需要 X509KeyStorageFlags.MachineKeySet。

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

      【讨论】:

        【解决方案3】:

        根据您的情况,您可能需要先在服务器上安装证书以提高信任级别,然后再导出 .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
          

        下载安装exe的WinHttpCertCfg.msihere

        更多关于如何使用证书配置的信息可以在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);
        

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

        【讨论】:

          【解决方案4】:

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

          指定的网络密码不正确

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

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

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

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

          【讨论】:

            【解决方案5】:

            您可能需要使用 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://stackoverflow.com/a/8291956/130352

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                【解决方案7】:

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

                经验教训...

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

                【讨论】:

                • @p.campell 是否可以从本地目录上传 .pfx 证书并获取该证书的指纹?
                猜你喜欢
                • 2012-01-07
                • 1970-01-01
                • 1970-01-01
                • 2022-08-03
                • 2016-06-12
                • 2022-12-17
                • 2015-09-02
                • 2020-07-11
                • 2016-05-03
                相关资源
                最近更新 更多