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

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

有帮助吗?

解决方案

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

学过的知识...

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

其他提示

您可能需要用户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

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

我必须为一个类似的项目执行此操作,以下是我关于如何完成此操作的笔记。

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

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

    C:\Program Files\Windows Resource Kits ools>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);

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

在“指定的网络密码不正确”当你试图在OS的商店之一导入证书已经存在在那家商店也将返回错误信息。

在我来说,我是想在专用应用程序模式下运行,我得到了同样的错误。

  

指定的网络密码不正确

在PrivateAuthenticator构造(在Xero.Api.Example.Applications.Private)试图导入证书假设没有在创建证书的过程中定义的密码。

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

然后,我改变导入到使用它使用密码的过载的方法,

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

您可能需要X509KeyStorageFlags.MachineKeySet。

我使用从Web作业证书。

在我的情况下在应用程序池改变身份到网络服务解决了这个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top