X509Certificate Constructeur Exception
//cert is an EF Entity and
// cert.CertificatePKCS12 is a byte[] with the certificate.
var certificate = new X509Certificate(cert.CertificatePKCS12, "SomePassword");
Lors du chargement d'un certificat à partir de notre base de données sur notre serveur de test (Windows 2008 R2/IIS7.5) nous obtenons cette exception:
System.Security.Cryptography.CryptographicException: An internal error occurred.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
REMARQUE: Ce problème ne se produit pas en local (Windows 7/Casini).
Tout insight est grandement apprécié.
- Découvrez stackoverflow.com/questions/1345262/... et stackoverflow.com/questions/6097380/...
- Je suppose que la source du problème est dans la
byte[]
données qui encert.CertificatePKCS12
. Sans avoir les données, on ne peut que deviner la raison de l'exception "Une erreur interne s'est produite". Donc, ma suggestion est que vous créez le certificat de test qui peut être utilisé dans votre environnement pour reproduire le problème, l'enregistrer dans le fichier et assurer le lien et le mot de passe (comme "SomePassword") pour le décodage du certificat. Après examen des données, on aura beaucoup plus de chances de trouver la reson et de proposer une solution de votre problème. - Merci pour la réponse @Oleg - si le tableau d'octets ont été mauvais, ne serait-il pas une erreur sur Win7 et Win2k8? Lorsque le tableau d'octets est écrit dans un fichier, il les importations correctement.
- Je veux dire, pas une erreur, mais la combinaison de certaines propriétés du certificat, la clé et ainsi de suite. Donc, il faut analyser le problème. Pour être en mesure de reproduire les résultats ou de les analyser un besoin d'avoir le fichier PFX que vous utilisez comme le tableau d'octets
cert.CertificatePKCS12
. - quelles sont les propriétés serait la cause de la panne sur un OS et pas un autre? Pour des raisons évidentes de sécurité, nous ne pouvons pas divulguer les certificats eux-mêmes.
- Pour comprendre ce que je veux dire que je peux le comparer à votre question avec le texte suivant: "Mon programme fonctionne sur mon ordinateur de développement, mais ne fonctionne pas sur mon serveur. Ce que la ligne de mon code ou de l'API que j'utilise pourrait être la raison?" Comme vous pouvez écrire beaucoup de programmes différents, on peut créer beaucoup de différents certificats et des clés. Sans avoir le code de votre programme (à partir de mon dernier exemple) ou sans avoir démo (non productif) certificat on peut seulement deviner, donc on ne peut pas résoudre votre problème. Essayez de créer démo certificat qui peut être utilisé pour reproduire le problème.
- L'affichage d'un certificat sans la clé privée (comme l'exportation en .Fichier CER) est absolument sans danger. Vous pouvez donc poster vos productif certificat CER (pas comme PFX). L'information peut réduire un peu trop un problème commun qui vous décrire.
Vous devez vous connecter pour publier un commentaire.
Y en a un paramètre dans le Pool d'Applications IIS configuration des Pools d'Applications > Paramètres Avancés) pour charger le profil d'utilisateur pour l'identité du pool d'applications de l'utilisateur. Lorsque la valeur est false, les conteneurs de clés ne sont pas accessibles.
Donc juste mis
Load User Profile
optionTrue
Plus que probablement, lorsque vous exécutez à partir de Visual Studio/Cassini, c'est accéder à votre utilisateur magasin de certificats, même si vous êtes en train de charger à partir d'octets. Pourriez-vous s'il vous plaît essayer cela et voir si cela résout votre problème:
Ce sera la cause de IIS (qui s'exécute en tant que ASP.NET l'utilisateur qui probablement n'ont pas accès à un magasin d'utilisateur) pour utiliser le magasin de l'ordinateur.
Cette page explique le constructeur dans le détail, et cette page explique le
X509KeyStorageFlags
énumération.Edit:
Basé sur le deuxième lien de cyphr, on dirait qu'il pourrait être une bonne idée (si la solution précédente ne fonctionne pas), de combiner certaines des
FlagsAttribute
énumération des valeurs comme:En outre, si vous y avez accès, vous pouvez essayer de changer votre Application Piscine à usage Local (et puis redémarrez le pool d'applications). Cela peut élever vos autorisations à un niveau approprié, si c'est bien le problème.
Enfin, vous pouvez utiliser
Fichier.WriteAllBytes
pour écrire leCertificatePKCS12
contenu d'un fichier pfx et voir si vous pouvez l'importer manuellement à l'aide du certificat de la console en vertu de la console MMC (vous pouvez supprimer après le succès de l'importation; c'est juste pour tester). Il se pourrait que vos données sont munged, ou le mot de passe est incorrect.X509KeyStorageFlags.MachineKeySet
drapeau, ainsi que lors de l'ajout de tous les troisMachineKeySet
,PersistKeySet
etExportable
drapeaux.File.WriteAllBytes
pour écrire leCertificatePKCS12
contenu d'un fichier pfx et voir si vous pouvez l'importer manuellement à l'aide du certificat de la console en vertu de la console MMC (vous pouvez supprimer après le succès de l'importation; c'est juste pour tester). Il se pourrait que vos données sont munged, ou le mot de passe est incorrect.SignTool.exe
à partir de votre ASP.NET de projet, vous aurez toujours besoin d'activer l'option "LoadUserProfile" pour leApplication Pool
. SinonSignTool.exe
échouera avecAn internal error occurred
erreur...Utiliser ce code:
J'ai eu du mal sur Windows Server 2012 R2 où ma demande n'a pas pu charger les certificats d'un PFX sur le disque. Les choses du bon travail, l'exécution de mon application en tant qu'administrateur, et l'exception a dit Accès Refusé, donc ça doit être un problème d'autorisations. J'ai essayé quelques-uns des conseils ci-dessus, mais j'ai toujours eu le problème. J'ai trouvé que le fait de spécifier les options suivantes en tant que troisième paramètre de la cert constructeur a fait le tour pour moi:
Pour être vraiment en mesure de résoudre votre problème et pas seulement deviner, que peut-il être, il faut être en mesure à reproduire votre problème. Si vous ne pouvez pas fournir de test de fichier PFX qui ont le même problème que vous avez à examiner le problème vous-même. La première question importante est: sont à l'origine de l'exception "Une erreur interne s'est produite" par la clé privée d'une partie de la PKCS12 ou dans la partie publique du certificat lui-même?
Donc je vous recommande d'essayer de répéter la même expérience avec le même certificat, exporté sans clé privée (comme .Fichier CER):
ou
Il pourrait aider à vérifier si l'origine de votre problème est la clé privée ou certaines propriétés du certificat.
Si vous avez un problème avec le fichier CER vous pouvez sûre de poster le lien vers le fichier parce qu'il l'ait publique d'information seulement. Sinon, vous pouvez au moins exécuter
ou
(vous pouvez utiliser d'autres options aussi) et après certaines parties de la sortie (par exemple les propriétés de la clé privée sans le PRIVATEKEYBLOB lui-même).
Une alternative à l'évolution de la Charge de l'Utilisateur le Profil est de faire la Demande d'utilisation de la Piscine de la Service Réseau Identité.
Voir aussi Ce qui se passe exactement lorsque j'ai mis LoadUserProfile de IIS piscine?
Vous devez importer un .cer certificat sur votre ordinateur local, magasin de clés. Il n'y a pas besoin d'importer vos .p12 cert - au lieu d'utiliser la deuxième certyficate émis à votre compte par Apple. Je pense qu'il doit être valide paire de certificats (un système de fichiers, le deuxième dans le fichier de clés). Vous devez régler tous les 3 drapeaux en dll de cours.