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!
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)
Cannot find the original signer.
(Win 2012r2, d'autres versions pourraient le mapper sur une autre chaîne)X509Certificate2Collection::Import(byte[])
/X509Certificate2Collection::Import(string)
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.
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