ASP.NET-指定的网络密码不正确

rsl1atfo  于 9个月前  发布在  .NET
关注(0)|答案(5)|浏览(132)

我在我的开发机器上有一个需要证书的WCF客户端,它工作正常。
部署到生产服务器后,我收到以下错误:

[CryptographicException: The specified network password is not correct.]

DEV - Win7 32位IIS 7.5
生产- Win SERVER 64位2008 IIS 7.5

即使网络之间没有密码,也没有证书密码。(我知道,因为开发人员没有密码)。唯一的密码,我有是周转基金之一,是相同的发展。

CrmServiceClient crm = new CrmServiceClient("CrmServiceEndpoint");
crm.ClientCredentials.UserName.UserName = CrmConfigRepository.CrmUserName;//fine
crm.ClientCredentials.UserName.Password = CrmConfigRepository.CrmPassword;//fine
crm.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2(Path);
///THIS WONT WORK AS WELL
crm.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2(Path, "", X509KeyStorageFlags.Exportable);

这是完整的堆栈

[CryptographicException: The specified network password is not correct. ]
   System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) +41
   System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0
   System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags) +372
   System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName) +101
   Externals.CrmConnection.Get() in C:\Users\avi\Documents\Visual Studio 2010\Projects\ExpressBroker\Externals\CrmConnection.cs:31
   ExpressBroker.Models.ActionsMetadata.Handlers.LeadAccountHandler.Handle(BrokerAction brokerAction, ActionStep step, Dictionary`2 httpPostDataCollection) in C:\Users\avi\Documents\Visual Studio 2010\Projects\ExpressBroker\ExpressBroker\Models\ActionsMetadata\Handlers\LeadAccountHandler.cs:45
   ExpressBroker.Models.ActionsMetadata.Handlers.BaseStepHandler.SecuredHandle(BrokerAction brokerAction, ActionStep step, Dictionary`2 httpPostDataCollection) in C:\Users\avi\Documents\Visual Studio 2010\Projects\ExpressBroker\ExpressBroker\Models\ActionsMetadata\Handlers\BaseStepHandler.cs:49
   ExpressBroker.Models.ActionsMetadata.Handlers.HandlerInvoker.Invoke(BrokerAction brokerAction, ActionStep actionStep, Dictionary`2 stepValues) in C:\Users\avi\Documents\Visual Studio 2010\Projects\ExpressBroker\ExpressBroker\Models\ActionsMetadata\Handlers\StepServerInoker.cs:29
   ExpressBroker.Controllers.LeadAccountController.Register(String step) in C:\Users\avi\Documents\Visual Studio 2010\Projects\ExpressBroker\ExpressBroker\Controllers\LeadAccountController.cs:28
   lambda_method(Closure , ControllerBase , Object[] ) +127
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +264
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39
   System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +129
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +784922
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +314
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +784976
   System.Web.Mvc.Controller.ExecuteCore() +159
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +335
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +54
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371

谢谢

56lgkhnf

56lgkhnf1#

试试这个:

new X509Certificate2(Path, "", X509KeyStorageFlags.MachineKeySet);

X509Certificate2构造函数似乎试图访问本地用户的私钥存储(即使在加载PFX并且私钥位于PFX中时)。对于asp.net,用户配置文件通常不会加载,因此用户密钥存储库不存在。CacheMachineKeySet告诉构造函数查看始终存在的本地计算机密钥存储。

i5desfxk

i5desfxk2#

我也有一个pfx文件的问题,问题是,它是使用AES 256-SHA 256加密导出的,这引发了与问题中相同的异常。AES 256-SHA 256仅在Windows 10 1703、Windows Server 2016及以上版本上受支持。更改为TripleDES-SHA1解决了这个问题。

kqhtkvqz

kqhtkvqz3#

我也有一个问题与PFX文件,问题是这样的:
使用AES256-SHA256加密导出(使用Windows 11 PC),当在我的服务器上使用PFX时,会引发与问题中相同的异常。这发生在我的C# .Net 4.7应用程序中,运行在Windows Server 2016上。将导出更改为TripleDES-SHA1“解决”了这个问题。显然Windows Server 2016不支持AES256-SHA256,但较新版本支持。

z9ju0rcb

z9ju0rcb4#

我在一个PFX证书文件中遇到了这个问题,该文件设置了40个字符的密码,Windows允许我导出它并导入它,但它不能在C#代码中使用,所以我更改为30个字符的密码,它可以工作。

kqlmhetl

kqlmhetl5#

要解决这个问题,有两件事要做。
1.将AppPool Identity从本地设置更改为Local System from Identity。
1.然后您需要将证书.p12/.pfx从AES 256-SHA 256转换为TripleDES-SHA 1,因为IIS 2016不支持AES 256-SHA 256。下面是转换的方法。
public static void ExportWithTripleDESSHA1(string inputCertPath,string inputPassword,string outputCertPath,string outputPassword){

// Validate the output path to make sure you have permissions
        string directory = Path.GetDirectoryName(outputCertPath);
        if (!Directory.Exists(directory))
        {
            Directory.CreateDirectory(directory);
        }

        X509Certificate2 cert = new X509Certificate2(inputCertPath, inputPassword, X509KeyStorageFlags.Exportable);
        if (cert.HasPrivateKey)
        {
            AsymmetricKeyParameter privateKey = DotNetUtilities.GetKeyPair(cert.PrivateKey).Private;
            X509CertificateEntry[] chain = new X509CertificateEntry[1];
            chain[0] = new X509CertificateEntry(DotNetUtilities.FromX509Certificate(cert));

            Pkcs12Store store = new Pkcs12Store();
            store.SetKeyEntry("scbprivateKey.pem", new AsymmetricKeyEntry(privateKey), chain);

            using (MemoryStream pfxStream = new MemoryStream())
            {
                store.Save(pfxStream, outputPassword.ToCharArray(), new SecureRandom());
                File.WriteAllBytes(outputCertPath, pfxStream.ToArray());
            }
        }
        else
        {
            Console.WriteLine("The certificate does not have a private key.");
        }`

相关问题