web-dev-qa-db-fra.com

Exception 'Impossible de trouver l'objet demandé' lors de la création de X509Certificate2 à partir de la chaîne

J'essaie de créer X509Certificate2 à partir de chaîne. Me laisser montrer un exemple:

string keyBase64String = Convert.ToBase64String(file.PKCS7);
var cert = new X509Certificate2(Convert.FromBase64String(keyBase64String));

et keyBase64String a un tel contenu: "MIIF0QYJKoZI ........hvcNAQcCoIIFwjCCBb4CA0="

et file.PKCS7 est tableau d'octets que j'ai téléchargé de la base de données .

J'ai l'exception suivante lors de la création de X509Certificate2:

Impossible de trouver l'objet demandé

Et la trace de la pile:

"Impossible de trouver l'objet demandé" X509Certificate2 Exception "Impossible de trouver Objet demandé"} à System.Security.Cryptography.CryptographicException.ThrowCryptographicException (Int32 Hr) à System.Security.Cryptography.X509Certificates.X509Utils._QueryCertBlobType (Byte [] RawData) à System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBl Mot de passe de l'objet X509KeyStorageFlags keyStorageFlags) à System.Security.Cryptography.X509Certificates.X509Certificate2..ctor (Byte [] RawData) à WebApp.SoupController.d__7.MoveNext sur D:\Projets\WebApp\Contrôleurs\SoupController.cs: ligne 118

S'il vous plaît, dites-moi ce que je fais mal. Toute aide serait grandement appréciée!

5
StepUp

Si file.PKCS7 représente un blob PKCS # 7 SignedData (ce qui est produit à partir de X509Certificate2 (Collection) .Export (X509ContentType.Pkcs7)), il existe deux manières de l'ouvrir:

  • new X509Certificate2(byte[])/new X509Certificate2(string)
    • Le constructeur de certificat unique extraira le certificat de signature du blob SignedData. Si cela venait juste d'être exporté en tant que collection de certificats, mais sans rien signer, il n'y a pas de tel certificat, donc il échoue avec Cannot find the original signer. (Win 2012r2, d'autres versions pourraient le mapper sur une autre chaîne)
  • X509Certificate2Collection::Import(byte[])/X509Certificate2Collection::Import(string)
    • L'importation de la collection consomme tous les certificats "supplémentaires", en ignorant le certificat de signature.

Donc, s'il s'agit vraiment de PKCS # 7, vous souhaiterez probablement la méthode Import (collection) de la collection. Si ce n'est pas le cas, vous avez des noms de variable/champ/propriété impairs.

2
bartonjs

Le constructeur de X509Certificate2 s'attend à obtenir un nom de fichier de certificat mais vous lui donnez une clé ( X509Certificate2 Constructor (String) )

Je suppose que keyBase64String est la clé de certificat et que le certificat est installé sur la machine qui exécute le code. Essaye ça:

var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certCollection = store.Certificates.Find(X509FindType.FindByThumbprint, keyBase64String , false);
//var certCollection = store.Certificates.Find(X509FindType.FindByKeyUsage, keyBase64String , false);
//var certCollection = store.Certificates.Find(X509FindType.FindBySubjectKeyIdentifier, keyBase64String , false);
var cert = certCollection[0];

Vous pouvez également essayer FindByKeyUsage, FindBySubjectKeyIdentifier ou d’autres types de - X509FindType Enumeration

0
Mockingbird