X509Certificate.CreateFromCertFile - 指定的网络密码不正确
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了X509Certificate.CreateFromCertFile - 指定的网络密码不正确相关的知识,希望对你有一定的参考价值。
我有一个.NET应用程序,我想用它作为客户端来调用SSL SOAP Web服务。我已获得一份名为foo.pfx
的有效客户证书。证书本身有密码。
我在以下位置找到了证书:C:certsfoo.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 encoded。
- .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组访问cert密钥。需要安装
winhttpcertcfg
(你可以点击下面的链接来获取你自己的副本)。 C: Program Files Windows资源工具包工具> winhttpcertcfg -i(pfx文件的路径,例如.e: Certs Foo.pfx)-c LOCAL_MACHINE My -a IIS_WPG -p(pfx文件的密码) - 吐出关键信息并授予特权
授予帐户私钥访问权限:
(SERVERNAME)IIS_WPG
下载安装exe的WinHttpCertCfg.msi
here。
有关如何使用cert配置的更多信息,请访问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);
这是我如何通过证书但不确定您需要对您的证书做什么,所以这可能与您不一样。
当您尝试在其中一个OS存储中导入的证书已存在于该存储中时,也会返回“指定的网络密码不正确”错误消息。
在我的情况下,我试图在私有应用程序模式下运行,我得到了同样的错误。
指定的网络密码不正确
假设在创建证书期间没有定义密码,PrivateAuthenticator构造函数(在Xero.Api.Example.Applications.Private
中)尝试导入证书。
_certificate = new X509Certificate2();
_certificate.Import(certificatePath);
然后我更改导入以使用使用密码的重载方法,
_certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate", X509KeyStorageFlags.MachineKeySet);
您可能需要X509KeyStorageFlags.MachineKeySet。
我正在使用来自网络工作的证书。
在我的例子中,在应用程序池中将Identity更改为NetworkService解决了这个问题。
以上是关于X509Certificate.CreateFromCertFile - 指定的网络密码不正确的主要内容,如果未能解决你的问题,请参考以下文章
将 python x509 签名请求对象 (x509.CertificateSigningRequest) 对象转换为字节
X509Chain.Build(...) System.InvalidCastException 从 X509Certificate 到 X509Certificate2