2011-11-27 15 views
11

Mam w mojej maszynie dev klienta WCF, który wymaga certyfikatu i działa dobrze.
Po wdrożenia na serwerze produkcyjnym pojawia się następujący błąd:ASP.NET - Podane hasło sieciowe nie jest poprawne

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

DEV - Win7 32BIT IIS 7.5
PRODUKCJA - Windows Server 64bit 2008 IIS 7.5

Mimo że nie jest hasło między sieciami i nie ma hasła do certyfikatu. (Wiem, bo program działa bez hasła). Jedyne hasło, które mam, to plik WCF, który jest taki sam jak 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); 

to całego stosu

[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 

Dzięki

+0

Jaka ścieżka jest przekazywana w konstruktorze X509Certificates? Myślę, że to hasło sieciowe uzyskujące dostęp do pliku certyfikatu. – Simon

+0

Możliwy duplikat? http://stackoverflow.com/q/899991/130352 –

Odpowiedz

32

Spróbuj tego:

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

Wydaje się, że konstruktor X509Certificate2 próbuje uzyskać dostęp do sklepu klucza prywatnego lokalu użytkownik (nawet przy ładowaniu PFX i klucz prywatny jest w PFX). W asp.net, profil użytkownika zazwyczaj nie jest załadowany, więc magazyn kluczy użytkownika nie istnieje. Określenie MachineKeySet mówi konstruktorowi, aby przeglądał magazyn kluczy Komputer lokalny, który zawsze istnieje.

+3

Uratowałem mój dzień ... co do cholery oni myśleli, kiedy zrobili Crypto API. To nie jedyne potwierdzenie, na które natrafiłem. –

+0

dziękuję! Nigdy nie myślałem, aby użyć tej źle nazwanej klasy, ale tylko to jest działające rozwiązanie! – balint

+0

Dzięki za to! – TheWebGuy

Powiązane problemy