webentwicklung-frage-antwort-db.com.de

Die Ausnahme des angeforderten Objekts konnte nicht gefunden werden, wenn X509Certificate2 aus einer Zeichenfolge erstellt wurde

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!

5
StepUp

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)
    • Der Einzelzertifikatkonstruktor extrahiert das Signaturzertifikat des SignedData-Blobs. Wenn dies nur als Sammlung von Zertifikaten exportiert wurde, aber nichts signiert, gibt es kein solches Zertifikat. Daher schlägt es mit Cannot find the original signer. fehl (Win 2012r2, andere Versionen könnten es einem anderen String zuordnen.)
  • X509Certificate2Collection::Import(byte[])/X509Certificate2Collection::Import(string)
    • Der Sammlungsimport verbraucht alle "zusätzlichen" Zertifikate, wobei das Signaturzertifikat ignoriert wird.

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.

2
bartonjs

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.

0
Mockingbird