2011-11-27 17 views
11

Nella mia macchina di sviluppo ho un client WCF che richiede un certificato e funziona correttamente.
Dopo la distribuzione al server di produzione ottengo il seguente errore:ASP.NET - La password di rete specificata non è corretta

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

DEV - Win7 32BIT IIS 7.5
PRODUZIONE - Win SERVER 64BIT 2008 IIS 7.5

Anche se non v'è alcuna password tra le reti e non c'è la password del certificato. (Lo so perché lo sviluppatore funziona senza password). L'unica password che ho è quella WCF uguale a quella del 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); 

questo è lo stack completo

[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 

Grazie

+0

Qual è il percorso passato nel costruttore X509Certificates? Penso che sia la password di rete ad accedere al file del certificato. – Simon

+0

Possibile duplicato? http://stackoverflow.com/q/899991/130352 –

risposta

32

Prova questo:

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

Sembra che il costruttore X509Certificate2 tenta di accedere al negozio chiave privata del locale utente (anche quando si carica un PFX e la chiave privata è nel PFX). Con asp.net, il profilo utente in genere non viene caricato, quindi l'archivio chiavi utente non esiste. La specifica di MachineKeySet indica al costruttore di esaminare il keystore del computer locale che esiste sempre.

+3

Salvato il mio giorno ... cosa diavolo stavano pensando quando hanno fatto l'API crittografica. Questo non è l'unico trucchetto sui certificati su cui mi imbatto. –

+0

grazie! Non ho mai pensato di usare quella classe mal chiamata, ma solo questa è la soluzione di lavoro! – balint

+0

Grazie per questo! – TheWebGuy

Problemi correlati