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

Спасибо

5 ответов

Решение

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

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

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

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

У меня также была проблема с файлом PFX, проблема заключалась в следующем:
экспортировано с использованием шифрования (с использованием ПК с Windows 11), что вызвало то же исключение, что и в вопросе, когда PFX использовался на моем сервере. Это произошло в моем приложении C# .Net 4.7, работающем на сервере Windows 2016. Изменение экспорта на TripleDES-SHA1"решил" вопрос. Видимо Windows Server 2016 не поддерживает AES256-SHA256, но более новые версии делают.

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

Чтобы решить эту проблему, нужно сделать две вещи.

  1. Измените идентификатор AppPool в локальных настройках на локальную систему из идентификатора.

  2. Затем вам необходимо преобразовать сертификат .p12/.pfx в TripleDES-SHA1 из AES256-SHA256 , поскольку IIS 2016 не поддерживает AES256-SHA256. Вот метод его преобразования.

    `public static void ExportWithTripleDESSHA1(строка inputCertPath, строка inputPassword, строка outputCertPath, строка 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.");
            }`
    
Другие вопросы по тегам