Was ist der Unterschied zwischen X509Certificate2 und X509Certificate in .NET?

Antworten:

104

Das x509-Zertifikat wurde in .NET v1.0 / 1.1 eingeführt und war (vergleichsweise) in seiner Funktionalität eingeschränkt. Es kann verwendet werden, um Informationen zu einem vorhandenen Zertifikat (gültige Daten, Aussteller usw.) abzurufen. Es hatte einfache Methoden / Operationen (dh Lesen eines Zertifikats von der Festplatte).

Das x509Certificate2 ist eine Unterklasse des x509Certificate mit zusätzlichen Funktionen.

  • Es handelt sich um ein aktuelles X509-Zertifikat.
  • Es war neu in .NET Framework v2.0.
  • Mit dieser Klasse haben Sie Zugriff auf alle Eigenschaften von V2 und V3 (Berechtigungsschlüssel-ID und Schlüsselverwendung).
  • Es unterstützt das Laden eines Zertifikats aus einem Zertifikatspeicher.
p.campbell
quelle
12
X509Certificate2hat auch ein Mitglied für den privaten Schlüssel, der nicht Teil des Zertifikats selbst ist, aber bequem der Klasse zugeordnet werden kann, die das X.509-Zertifikat darstellt.
Bruno
21

Der Vollständigkeit halber finden Sie hier eine Kopie des relevanten Abschnitts der Website, auf den in der Antwort von @ dommer verwiesen wird, da die Website möglicherweise nicht mehr aktiv ist und sich nur noch lange im Google-Cache befindet, wer weiß wie lange:

In Version 1.1 des Frameworks gab es nur die X509Certificate-Klasse, mit der Sie Zertifikate bearbeiten können. Tatsächlich bot die X509Certificate-Klasse v1.1 nur grundlegende Unterstützung: Sie gewährte nur Zugriff auf die X509-Felder der Version 1 (wie das gültige Datum und das gültige Datum, den Betreff und den öffentlichen Schlüssel), nicht jedoch auf die Felder der Version 2 (wie die Berechtigungsschlüssel-ID) ) noch Felder der Version 3 (wie die Schlüsselverwendung). Es gab keine Unterstützung für das Laden eines Zertifikats aus einem Zertifikatspeicher und es gibt auch keine Möglichkeit, auf Zertifikatsperrlisten oder Zertifikatsvertrauenslisten zuzugreifen. Microsoft hat dies mit dem WSE-Toolkit (Web Services Enhancement) verbessert, das die Zertifikatklasse erweitert und Klassen für den Zugriff auf Zertifikatspeicher bereitstellt. Diese Klassen finden Sie jetzt in der .NET 3.0 / 2.0-Framework-Bibliothek.

Die erste große Änderung ist eine neue Klasse namens X509Certificate2, die von X509Certificate abgeleitet ist. Die Methoden für den Zugriff auf die X509-Zertifikatfelder sind veraltet, und jetzt verfügt die Klasse über Eigenschaften für den Zugriff auf diese Felder. Wenn dem Zertifikat ein privater Schlüssel zugeordnet ist, gewährt die Klasse außerdem Zugriff auf diesen Schlüssel. Es gibt Methoden, mit denen Sie ein Kennwort eingeben können, wenn der private Schlüssel durch eines geschützt ist. Das Kennwort wird über einen SecureString-Parameter übergeben. Hierbei handelt es sich um einen speziellen Typ, der sicherstellt, dass der belegte Speicher überschrieben wird, wenn das Objekt nicht mehr verwendet wird, sodass das Kennwort nicht von einem anderen Prozess auf dem Computer gelesen werden kann. Sichere Zeichenfolgen und andere Formen geschützter Daten werden in einem späteren Abschnitt behandelt.

Da X509Certificate2 von X509Certificate abgeleitet ist, können Sie die statischen Methoden CreateFromeCertFile und CreateFromSignedFile über die X509Certificate2-Klasse aufrufen. Diese Methoden geben jedoch ein X509Certificate-Objekt zurück, und Sie können dies nicht in ein X509Certificate2-Objekt umwandeln. Die X509Certificate-Klasse wurde in Version 3.0 / 2.0 verbessert: Sie bietet Eigenschaften für den Zugriff auf einige der X509-Felder. Es bietet Import- und Exportmethoden zum Initialisieren eines Objekts aus einem Byte-Array oder zum Generieren eines Byte-Arrays aus dem Zertifikat und verfügt über Konstruktoren, die ein Objekt aus einer Datei (ASN.1 DER) und aus einem Byte-Array erstellen. Interessanterweise verfügt die X509Certificate2-Klasse über einen Konstruktor, der aus einem X509Certificate-Objekt ein X509Certificate2-Objekt erstellen kann.

So viele Goblins
quelle
6

Versuchen Sie Folgendes, um ein X.509-Zertifikat von "X509Certificate" in "X509Certificate2" zu konvertieren:

X509Certificate  X509  = sslStream.RemoteCertificate;
X509Certificate2 X5092 = new X509Certificate2(X509);
ftexperts
quelle
2

Für diejenigen, die das Zertifikat lesen und zur Authentifizierung verwenden möchten, wird einfach ein X509Certificate2 erstellt und das X509Certificate in seinem Konstruktor übergeben.

Für eine signierte Assembly (die exe) wäre der Code ein Code wie dieser, und ich lasse der Einfachheit halber die Fehlerüberprüfung weg.

Module m = Assembly.GetEntryAssembly().GetModules()[0];
using (var cert = m.GetSignerCertificate())
using (var cert2 = new X509Certificate2(cert))
{
   var _clientHandler = new HttpClientHandler();
   _clientHandler.ClientCertificates.Add(cert2);
   _clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
   var myModel = new Dictionary<string, string>
   {
       { "property1","value" },
       { "property2","value" },
   };
   using (var content = new FormUrlEncodedContent(myModel))
   using (var _client = new HttpClient(_clientHandler))
   using (HttpResponseMessage response = _client.PostAsync($"{url}/{controler}/{action}", content).Result)
   {
       response.EnsureSuccessStatusCode();
       string jsonString = response.Content.ReadAsStringAsync().Result;
       var json = new Newtonsoft.Json.JsonSerializer();
       var myClass = JsonConvert.DeserializeObject<MyClass>(json);
    }
}

Offensichtlich heißt Ihre Klasse nicht MyClass, sondern ein Geschäftsobjekt, das Sie vom Webdienst erwarten würden.

Sie können eine Klasse an Ihre Aktion senden, indem Sie die gewünschte Eigenschaft und den gewünschten Wert senden. Sie können jetzt sicherstellen, dass die Anforderung, die Sie erhalten haben, von einem gültigen Mobil- oder Windows-Client stammt, indem Sie das Anforderungszertifikat folgendermaßen lesen:

public class MyController : ApiController
{
    public IHttpActionResult Get()
    {           
       X509Certificate2 clientCertInRequest = Request.HttpContext.Connection.ClientCertificate;
       if (!clientCertInRequest.Verify() || !AllowedCerialNumbers(clientCertInRequest.SerialNumber))
       {
            Response.StatusCode = 404;
            return null;
       }
       //your code
   }

}}

Was bleibt, ist, Ihren Webserver so einzustellen, dass er Client-Zertifikate akzeptiert ... Sie können alles über Eigenschaften lesen, die aus dem neuen Format stammen, und Sie haben Ihren öffentlichen Webdienst gesichert. Die meisten tun dies nicht, da es nicht gut genug ist, nur autorisiert zu sein mehr (wenn es jemals war)

Walter Vehoeven
quelle