Überprüfen des X.509-Zertifikats in C # mit Compact Framework

Ich versuche, ein X.509-Zertifikat mit C # und .NetCF zu validieren. Ich habe das CA-Zertifikat und wenn ich es richtig verstehe, muss ich den öffentlichen Schlüssel dieses CA-Zertifikats verwenden, um die Signatur des nicht vertrauenswürdigen Zertifikats zu entschlüsseln. Dies sollte mir den berechneten Hash-Wert des nicht vertrauenswürdigen Zertifikats geben. Ich sollte dann den Hash des Zertifikats selbst berechnen und sicherstellen, dass die beiden Werte übereinstimmen.

Ich spiele seit ein paar Tagen damit und komme nicht sehr weit. Ich habe die Klassen X509Certificate und RSACryptoServiceProvider verwendet. Zuerst habe ich versucht, den öffentlichen Schlüssel und die Signatur aus der X509Certificate-Klasse abzurufen. Ich konnte den öffentlichen Schlüssel bekommen, aber nicht die Signatur. Als Nächstes habe ich versucht, die Binärdaten zu analysieren, aus denen das Zertifikat besteht. Dadurch konnte ich die Signatur (und alle anderen gewünschten Daten) abrufen. Die Signatur konnte jedoch nicht mit dem RSACryptoServiceProvider entschlüsselt werden. Ich habe solche Dinge ausprobiert, aber es gab immer wieder Ausnahmen, die "Bad Key" sagten, als ich versuchte zu entschlüsseln:

RSAParameters rsaParams = new RSAParameters();
rsaParams.Exponent = exp;
rsaParams.Modulus = mod;
RSACryptoServiceProvider rsaServ = new RSACryptoServiceProvider();
rsaServ.ImportParameters(rsaParams);
byte[] decryptedSig = rsaServ.Decrypt(encryptedSig, false);

Jeder Rat wäre sehr dankbar.

Edit: Ich habe etwas ausprobiert, das besser zu sein scheint, aber ein seltsames Ergebnis liefert. Ich arbeite hier mit der X509Certificate2-Klasse, da das Testen etwas einfacher ist, aber ich muss später für .NetCF auf X509Certificate wechseln. Ich denke, dass RSACryptoServiceProvider.VerifyData sein könnte, was ich brauche. Ich habe den folgenden Code ausprobiert.

X509Certificate2 cert = new X509Certificate2(certBytes);
X509Certificate2 certCA1 = new X509Certificate2(@"C:\certs\certCA1.cer");

byte[] encryptedSig = new byte[256];
Array.Copy(certBytes, certBytes.Length - 256, encryptedSig, 0, 256);

RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)certA1.PublicKey.Key;
bool good = rsa.VerifyData(cert.RawData, "1.3.14.3.2.26", encryptedSig);

Wie gesagt, ich kann die Binärdaten des Zertifikats manuell dekodieren und interpretieren, daher bin ich mir ziemlich sicher, dass cert.RawData die signierten Daten des Zertifikats und die letzten 256 Byte die verschlüsselte Signatur sind. Die Zeichenfolge ist die OID des Hash-Algorithmus, den ich vom Zertifikat erhalten habe, aber ich bin nicht zu 100% sicher, dass sie korrekt ist. VerifyData gibt false zurück, aber ich bin mir noch nicht sicher, warum.

Gedanken

Antworten auf die Frage(6)

Ihre Antwort auf die Frage