Comment construire une X509Certificate2 à partir d'un fichier PKCS#12 tableau d'octets jeter CryptographicException(“Le système ne peut pas trouver le fichier spécifié.”)?
Je suis en train de construire un X509Certificate2
à partir d'un fichier PKCS#12 blob dans un tableau d'octets et d'obtenir un assez déroutant d'erreur. Ce code est en cours d'exécution dans une application de bureau avec des droits d'administrateur sur Windows XP.
La trace de la pile est comme suit, mais je me suis perdu en essayant de résoudre les problèmes, car _LoadCertFromBlob
est marqué [MethodImpl(MethodImplOptions.InternalCall)]
.
System.Security.Cryptography.CryptographicException: The system cannot find the file specified.
at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(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)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
EDIT: Le blob est un vrai PKCS#12 généré par BouncyCastle pour C# contenant une clé privée RSA et certificat auto-signé ou récemment inscrit auprès d'une autorité de certification) -- ce que je suis en train de faire est de convertir la clé privée et le certificat du BouncyCastle bibliothèque pour le Système.De sécurité.Bibliothèque de cryptographie par l'exportation à partir de l'un et de l'importation à l'autre. Ce code fonctionne sur la plupart des systèmes, il a été essayé sur; j'ai juste jamais vu cette erreur renvoyé à partir de ce constructeur. Il peut être une sorte de environnemental "bizarre" sur une boîte.
EDIT 2: L'erreur se produit dans un environnement différent dans une autre ville, et je suis incapable de reproduire localement, donc j'ai peut-être la craie jusqu'à une fracture installation de windows XP.
Depuis que vous avez posées, même si, ici, est le fragment en question. Le code prend une clé privée et le certificat en BouncyCastle représentation, supprime les certificats précédents pour le même Nom unique du personnel du magasin de clés, et les importations de la nouvelle clé privée et le certificat dans le personnel clé de stockage par le biais d'un intermédiaire PKCS#12 blob.
//open the personal keystore
var msMyStore = new X509Store(StoreName.My);
msMyStore.Open(OpenFlags.MaxAllowed);
//remove any certs previously issued for the same DN
var oldCerts =
msMyStore.Certificates.Cast<X509Certificate2>()
.Where(c => X509Name
.GetInstance(Asn1Object.FromByteArray(c.SubjectName.RawData))
.Equivalent(CurrentCertificate.SubjectDN))
.ToArray();
if (oldCerts.Length > 0) msMyStore.RemoveRange(new X509Certificate2Collection(oldCerts));
//build a PKCS#12 blob from the private key and certificate
var pkcs12store = new Pkcs12StoreBuilder().Build();
pkcs12store.SetKeyEntry(_Pkcs12KeyName,
new AsymmetricKeyEntry(KeyPair.Private),
new[] {new X509CertificateEntry(CurrentCertificate)});
var pkcs12data = new MemoryStream();
pkcs12store.Save(pkcs12data, _Pkcs12Password.ToCharArray(), Random);
//and import it. this constructor call blows up
_MyCertificate2 = new X509Certificate2(pkcs12data.ToArray(),
_Pkcs12Password,
X509KeyStorageFlags.Exportable);
msMyStore.Add(_MyCertificate2);
msMyStore.Close();
Vous devez vous connecter pour publier un commentaire.
Avez-vous des PKCS#12 ou juste PFX-fichier? Dans le monde Microsoft c'est la même chose, mais d'autres pensent à un autre (voir http://www.drh-consultancy.demon.co.uk/pkcs12faq-old.html#PFX).
Vous pouvez essayer de suivre les
(voir http://msdn.microsoft.com/en-us/library/ms148418.aspx) ou
(voir http://msdn.microsoft.com/en-us/library/ms148420.aspx et http://msdn.microsoft.com/en-us/library/ms148442.aspx si vous avez besoin d'utiliser un certain nombre de drapeaux)
Mis à JOUR: Il serait utile si vous insérer un fragment de code et pas seulement la trace de pile d'exception.
Qui
X509KeyStorageFlags
utilisez-vous? Vous pouvez utiliser Le Moniteur De Processus pour trouver quel fichier n'a pas pu trouver leX509Certificate2
constructeur. Il peut être, par exemple, qu'il n'y a aucun conteneur de clé par défaut pour l'utilisateur en cours sur le Windows XP d'avoir le problème. Vous pouvez le créer et recommencer l'importation.PersistKeySet
n'est pas bon dans votre scénario, vous devrez tout simplement pas l'utiliser. De l'autre côté, si le certificat est importé avecPersistKeySet
la clé sera placé dans le stockage de la clé en tant que fichier (profil utilisateur).CertGetCertificateContextProperty
avecCERT_KEY_PROV_INFO_PROP_ID
obtenir les informations. On peut obtenir le nom de fichier à l'aide dePP_UNIQUE_CONTAINER
. Le fichier est sousCommonApplicationData
(avecMicrosoft\Crypto\RSA\MachineKeys
suffixe)Je suis tombé sur le même problème.
Selon cette l'article le problème était que le constructeur tente de charger le cert dans le profil de l'utilisateur actif, mais le .Net code j'ai été l'identification de l'utilisateur et donc il n'avait pas chargé le profil de l'utilisateur. Le constructeur nécessite le chargement du profil de l'utilisateur pour fonctionner correctement.
De l'article:
De charger le profil d'utilisateur correction de l'erreur.
Cours d'exécution dans une application web sur Windows 2012, l'application Réglage de l'option pool
Load User Profile
à vrai fait le travail.Pour ce faire, exécutez
inetmgr.exe
, allez à laAdvanced Settings
pour la bonne application de la piscine, changementLoad User Profile
sousProcess Model
de vrai.J'ai eu ce même problème.
Cela permet à l' crypto-système de travail.
J'ai eu exactement le même problème. Le même code et les données/certs marche bien sur Windows 2003 x86 lors de l'exécution en vertu d'un utilisateur spécifique, mais a échoué sous un autre compte (qui a également été utilisé pour l'exécution des pools d'applications IIS).
Apparemment, quelque chose d'autre qui a épuisé les ressources sur Windows, de sorte que le défaut de l'utilisateur ne pouvait pas vraiment charger le profil de l'utilisateur (son bureau est bizarre), mais il y avait pas liées à des événements dans l'Observateur d'Événements.
Un redémarrage résoudre le problème temporairement. Bien que ce n'est pas une solution permanente à ce problème, il montre qu'il y a quelque chose d'autre (par exemple, des composants COM+, le code natif de services, etc) consommation de ressources qui doit être étudié. Il montre aussi l'instabilité des plates-formes Windows...