2009-08-28 18 views
70

J'essaie utiliser un certificat auto-signé (C#):"Une erreur interne s'est produite." lors du chargement de fichier PFX avec X509Certificate2

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

sur un serveur d'hébergement Web partagé et je suis arrivé une erreur:

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

extrémités de traces de pile avec

System.Security.Cryptography.CryptographicException. 
    ThrowCryptogaphicException(Int32 hr) +33 
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) +237 
System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(
    String fileName, String password) +131 

Sur ma machine de dev il charge ok. La raison pour laquelle je charge * .pfx n'est pas un fichier * .cer car j'ai besoin d'un accès par clé privée (le fichier cer charge Ok). Je fait PFX sur mon dev mochine comme ça:

makecert -r -n "CN=myhost.com, [email protected]" -sky exchange -b 01/01/2009 
    -pe -sv myhost.pvk myhost.cer 
<b>pvk2pfx</b> -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po pass</code> 

J'utilise v5.131.3790.0 version de makecert

+0

Peut-être que cet article peut aider: http://www.codeproject.com/KB/WCF/wcfcertificates.aspx – Emmanuel

+0

Je recevais le message d'erreur 'le système ne peut pas trouver le fichier spécifié'. La réponse de @Ry Levy a fonctionné pour moi! – Jess

Répondre

136

Utilisez le magasin de l'ordinateur 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 informatique local plutôt que dans le magasin utilisateur actuel". La valeur par défaut sans flags est à placer dans le magasin de l'utilisateur.

Même si vous lisez le certificat à partir du disque et le stockez dans un objet, les clés privées sont toujours stockées dans la base de données de clés du fournisseur de services cryptographiques de l'API Microsoft Cryptographic. 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 l'identité de la configuration IIS ou de l'application, qui fonctionne. Cependant, ceci suppose qu'il y a un accès à ces éléments de configuration qui peut ne pas être le cas (par exemple dans un environnement d'hébergement partagé).

+3

oui ça aide, merci. pourriez-vous expliquer pourquoi? docs ne dit rien d'utile. –

+2

Vous avez sauvé ma journée. Bizarrement, cela a fonctionné sur ma machine avant de mettre à jour la solution vers .NET 4.0 –

+1

En effet, tout ce qu'il fallait faire était de définir le paramètre X509KeyStorageFlags.MachineKeySet. C'est vraiment triste que l'exception lancée indique simplement "Une erreur interne s'est produite". Pas très utile. – Nicholi

8

J'ai essayé la solution de Randy de changer à MachineKeySet, mais ont reçu le message d'erreur:

« clé non valide pour une utilisation dans l'état spécifié »

Ainsi, après un peu googler autour j'ai trouvé un poste qui suggéré de le changer pour:

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

et cela a résolu mes problèmes.

Je n'ai pas encore essayé la suggestion de modifier le paramètre du pool d'applications de configuration dans la configuration IIS. Pour ce faire, accédez aux paramètres avancés du pool d'applications de votre site, puis définissez "load user profile" sur true. Lorsque ce paramètre est false, les conteneurs de clés ne sont pas accessibles apparemment.

+0

Je recevais l'erreur mentionnée ci-dessus et votre solution a aidé à la résoudre. Je vous remercie. – mohang