ASP.NET - указанный сетевой пароль неверен

На моем компьютере разработчика установлен клиент WCF, которому требуется сертификат, и он работает нормально.
После развертывания на производственном сервере я получаю следующую ошибку:

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

DEV - Win7 32BIT IIS 7.5
ПРОИЗВОДСТВО - Win SERVER 64BIT 2008 IIS 7.5

Хотя между сетями нет пароля и нет пароля сертификата. (Я знаю, потому что разработчик работает без пароля). Единственный пароль, который у меня есть, - это пароль WCF, который совпадает с паролем DEV.

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

Спасибо


person SexyMF    schedule 27.11.2011    source источник
comment
Какой путь передан в конструкторе X509Certificates? Я думаю, это сетевой пароль доступа к файлу сертификата.   -  person Simon    schedule 27.11.2011
comment
Возможный дубликат? stackoverflow.com/q/899991/130352   -  person Chris J    schedule 29.01.2015


Ответы (3)


Попробуй это:

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

Похоже, что конструктор X509Certificate2 пытается получить доступ к хранилищу закрытых ключей локального пользователя (даже при загрузке PFX, а закрытый ключ находится в PFX). В asp.net профиль пользователя обычно не загружается, поэтому хранилище ключей пользователя не существует. Указание MachineKeySet указывает конструктору посмотреть на всегда существующее хранилище ключей локального компьютера.

person fatnjazzy    schedule 28.11.2011
comment
Если вы установите параметр X509KeyStorageFlags, он будет создавать файл ключа в папке C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys каждый раз, когда вы создаете экземпляр объекта X509Certificate2, если вы делаете это часто, вы можете в конечном итоге заполнить диск, поэтому используйте это осторожно. - person NahuelGQ; 31.03.2016
comment
Лучшее решение для меня - заставить asp загружать профиль пользователя. Проверьте stackoverflow.com/a/10048789/356604 - person NahuelGQ; 31.03.2016
comment
Это прекрасно работает. Если у вас есть пароль и вы хотите его применить, вам придется запустить его таким образом. X509Certificate2 certificate = new X509Certificate2 (Path, yourpassword, X509KeyStorageFlags.MachineKeySet); - person Victor.Uduak; 17.05.2018
comment
Сразу хочу упомянуть новый X509Certificate2 (Path, your-password, X509KeyStorageFlags.MachineKeySet); - person Mohammad Hassani; 02.02.2020

У меня также была проблема с файлом pfx, проблема заключалась в том, что он был экспортирован с использованием шифрования AES256-SHA256, что вызвало то же исключение, что и в вопросе. Согласно this, AES256-SHA256 поддерживается только в Windows 10 1703 , Windows Server 2016 и выше. Переход на TripleDES-SHA1 «решил» проблему.

person ferikeem    schedule 17.03.2021
comment
См. Также: ссылка - person ferikeem; 17.03.2021
comment
Если кто-то другой столкнется с этой проблемой, пытаясь загрузить такой сертификат с шифрованием AES256 на портале Azure или загружая его по коду из массива файлов / байтов ... У меня такая же (вводящая в заблуждение) ошибка, которую я решил только повторно экспортируя сертификат в 3DES-SHA1. Что странно, потому что локально он работал, но перестал работать после публикации в веб-приложении ... PS: До этого я также пытался сократить пароль, но это ничего не решало. - person Luke; 03.05.2021

У меня была эта проблема с файлом сертификата PFX, в котором был установлен пароль из 40 символов, Windows позволила мне экспортировать его, а также импортировать, но его нельзя было использовать в коде C #, поэтому я изменил пароль на 30 символов, и он работает.

person Peroxy    schedule 07.07.2020