“Une erreur interne s’est produite.” Lors du chargement du fichier pfx avec X509Certificate2

J’essaie d’utiliser un certificate auto-signé (c #):

X509Certificate2 cert = new X509Certificate2( Server.MapPath("~/App_Data/myhost.pfx"), "pass"); 

sur un serveur d’hébergement Web partagé et j’ai reçu une erreur:

 System.Security.Cryptography.CryptographicException: An internal error occurred. 

la trace de la stack se termine par

 System.Security.Cryptography.CryptographicException. ThrowCryptogaphicException(Int32 hr) +33 System.Security.Cryptography.X509Certificates.X509Utils. _LoadCertFromFile(Ssortingng fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0 System.Security.Cryptography.X509Certificates.X509Certificate. LoadCertificateFromFile(Ssortingng fileName, Object password, X509KeyStorageFlags keyStorageFlags) +237 System.Security.Cryptography.X509Certificates.X509Certificate2..ctor( Ssortingng fileName, Ssortingng password) +131 

Sur ma machine de développement, ça charge bien. La raison pour laquelle je charge * .pfx pas un fichier * .cer parce que j’ai besoin d’un access à la clé privée (cer fichier se charge bien). J’ai fait du pfx sur mon mochine comme ça:

 makecert -r -n "CN=myhost.com, E=admin@myhost.com" -sky exchange -b 01/01/2009 -pe -sv myhost.pvk myhost.cer pvk2pfx -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po pass 

J’utilise la version v5.131.3790.0 de makecert

    Utilisez le magasin d’ordinateurs local pour la clé privée:

     X509Certificate2 cert = new X509Certificate2("myhost.pfx", "pass", X509KeyStorageFlags.MachineKeySet); 

    MachineKeySet est décrit comme “les clés privées sont stockées dans le magasin de l’ordinateur local plutôt que dans le magasin de l’utilisateur actuel”. La valeur par défaut sans indicateur est de placer dans le magasin de l’utilisateur.

    Même si vous lisez le certificate à partir du disque et que vous le stockez dans un object, les clés privées sont toujours stockées dans la firebase database de clés du fournisseur de services cryptographiques de l’API cryptographique Microsoft. Sur le serveur d’hébergement, le processus ASP.NET n’est pas autorisé à accéder au magasin de l’utilisateur.

    Une autre approche (selon certains commentaires ci-dessous) consiste à modifier la configuration d’IIS ou l’identité du pool d’applications – ce qui fonctionne. Cependant, cela suppose qu’il y ait un access à ces éléments de configuration, ce qui peut ne pas être le cas (par exemple, dans un environnement d’hébergement partagé).

    J’ai essayé la solution de Randy pour le changer en MachineKeySet, mais j’ai ensuite reçu le message d’erreur:

    “clé non valide pour une utilisation dans un état spécifié”

    Donc, après un peu de recherche sur Google, j’ai trouvé un article proposant de le remplacer par:

     var certificatee = new X509Certificate2(certKeyFilePath, passCode, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet ); 

    et cela a réglé mes problèmes.

    Je n’ai pas encore essayé de modifier le paramètre du pool d’applications dans la configuration IIS. Pour ce faire, accédez aux parameters avancés du pool d’applications de votre site, puis définissez “charger le profil utilisateur” sur true. Lorsque ce paramètre est faux, les conteneurs de clés ne sont apparemment pas accessibles.