web-dev-qa-db-fra.com

CryptographicException n'a pas été gérée: le système ne peut pas trouver le fichier spécifié

J'essaie d'embrasser les mystères de la communication SSL et j'ai trouvé un excellent tutoriel sur ce site . J'essayais de tester mon propre certificat. À l'aide de Visual Studio 2012, j'ai simplement ajouté un fichier existant (mon certificat au format .pfx), puis j'ai modifié les paramètres "certificat" et "mot de passe" dans app.config. Cependant, en essayant de l'exécuter, j'ai eu une erreur:

CryptographicException n'a pas été gérée: le système ne peut pas trouver le fichier spécifié

Ensuite, j'ai essayé la même chose dans mon service Web. Là, j'ai eu plus de détails sur l'erreur:

System.Security.Cryptography.CryptographicException: System cannot find specified file.

   at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
   at System.Security.Cryptography.X509Certificates.X509Utils._QueryCertFileType(String fileName)
   at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags)
   v System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
   v TestServer.DataService.LoadSoap() v c:\Users\Administrator\Documents\Visual Studio 2012\Projects\TestServer\TestServer\DataService.asmx.cs:line 48

J'ai écrit cette question à l'auteur de l'article, mais comme sa dernière réponse date de mars 2012, je ne sais pas s'il répondra. Si quelqu'un pouvait m'aider à résoudre ce problème, je lui en serais très reconnaissant.

P.S .: Lors de l'exportation du certificat de .cer vers .pfx, j'ai changé le titre du fichier exporté. Bien que je doute de son effet sur le problème, je préfère le mentionner.

52
Storm

Avez-vous défini les éléments suivants sur le pool d'applications dans IIS?

  1. Accédez à IIS Manager
  2. Accédez à l'instance du pool d'applications
  3. Cliquez sur paramètres avancés
  4. Sous Modèle de processus, définissez Charger le profil utilisateur sur true

Voir cette question de pile pour une lecture plus approfondie: Que se passe-t-il exactement lorsque je définit LoadUserProfile de IIS pool?

184
nologo

Pour ceux d'entre vous qui ont reçu l'exception cryptographique lors de la tentative d'importation d'un X509Certificate2 à l'aide de la méthode d'importation, j'ai trouvé que l'utilisation de l'option Enum pour MachineKeySet a contourné la nécessité de créer un userContext dans IIS, et donc plus facile à implémenter.

X509Certificate2 cert = new X509Certificate2();
cert.Import(certificateFilePath, certPasshrase, 
X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
7
Salomon Arias

Parce que cette question a un classement de recherche élevé, je voudrais présenter un moyen de présenter X509Certificate2 avec un chemin absolu (qu'il n'accepte que) vers un fichier de clé pxf relativement situé dans une application ASP.net.

    string path = HttpContext.Current.Server.MapPath("~") + "..\keys\relative_key.pfx";

    X509Certificate2 cert = new X509Certificate2(path, "", X509KeyStorageFlags.DefaultKeySet);
6
m12lrpv

En passant CspParameters avec l'indicateur csdMachineKeyKeyStore IIS peut contourner la restriction qui lève l'exception.

CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = Guid.NewGuid().ToString().ToUpperInvariant();
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspParams);

J'ai fondé la solution ici:

Lien vers la ressource d'information

6
Alejandro PC

Vous devez spécifier un chemin absolu au lieu d'un chemin relatif.

AppDomain.CurrentDomain.BaseDirectory +"/Certificate/cer.PFX"
2
user2607417