Ich versuche, X509Certificate2
aus einer Zeichenfolge zu erstellen. Lassen Sie mich ein Beispiel zeigen:
string keyBase64String = Convert.ToBase64String(file.PKCS7);
var cert = new X509Certificate2(Convert.FromBase64String(keyBase64String));
und keyBase64String
hat einen solchen Inhalt: "MIIF0QYJKoZI ........hvcNAQcCoIIFwjCCBb4CA0="
und file.PKCS7
ist Byte-Array, das ich aus der Datenbank heruntergeladen habe.
Ich habe beim Erstellen von X509Certificate2
die folgende Ausnahme erhalten:
Kann das angeforderte Objekt nicht finden
Und die Stack-Spur:
"Angefordertes Objekt kann nicht gefunden werden" X509Certificate2 - Ausnahme "Angefordertes Objekt Kann nicht gefunden werden"} um System.Security.Cryptography.CryptographicException.ThrowCryptographicException (Int32 Hr) um System.Security.Cryptography.X509Certificates.X509Utils._QueryCertBlobType (Byte [] RawData) um System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFreeBlob (Byte []...................... Objektkennwort, X509KeyStorageFlags keyStorageFlags) um System.Security.Cryptography.X509Certificates.X509Certificate2..ctor (Byte [] RawData) um WebApp.SoupController.d__7.MoveNext (). in D:\Projekte\WebApp\Controller\SoupController.cs: Zeile 118
Bitte sag mir, was ich falsch mache. Jede Hilfe wäre sehr dankbar!
Wenn file.PKCS7
ein PKCS # 7-SignedData-Blob darstellt (was von X509Certificate2 (Collection) .Export (X509ContentType.Pkcs7) erzeugt wird), gibt es zwei verschiedene Möglichkeiten, es zu öffnen:
new X509Certificate2(byte[])
/new X509Certificate2(string)
Cannot find the original signer.
fehl (Win 2012r2, andere Versionen könnten es einem anderen String zuordnen.)X509Certificate2Collection::Import(byte[])
/X509Certificate2Collection::Import(string)
Wenn es sich also wirklich um PKCS # 7 handelt, möchten Sie wahrscheinlich die Collection (Instanz) -Methode. Wenn dies nicht der Fall ist, haben Sie einige ungerade Variablen-/Feld-/Eigenschaftsnamen.
Der Konstruktor von X509Certificate2 erwartet einen Zertifikatsdateinamen, aber Sie geben ihm einen Schlüssel ( X509Certificate2 Constructor (String) ).
Ich gehe davon aus, dass keyBase64String der Zertifikatschlüssel ist und dass das Zertifikat auf dem Computer installiert ist, auf dem der Code ausgeführt wird. Versuche dies:
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];
Sie können auch FindByKeyUsage, FindBySubjectKeyIdentifier oder andere Arten von X509FindType Enumeration versuchen.