Sie sind hier: Lexikon/Glossar
Werbung

Was ist Digitales Zertifikat ?

Digitale Zertifikate sind allgegenwärtig in Unternehmen, Internet und der Cloud.

Digitale Zertifikate dienen in der IT dazu, Identitäten zu bestätigen und Datenintegrität sowie Vertraulichkeit sicherzustellen. TLS-Zertifikate (alias: SSL-Zertifikate) für Websites sind die bekanntesten, aber es gibt eine Reihe anderer digitaler Zertifikate, je nach Anwendungsgebiet:
  • Code Signing-Zertifikate zur digitale Signatur von Software/Code.
  • S/MIME-Zertifikate zum Signieren und Verschlüsseln von E-Mails
  • Dokumenten-Signaturzertifikate zur digitalen Signatur von PDF- oder Office-Dokumenten.
  • Client-Authentifizierungszertifikate zur Authentifizierung von Benutzern gegenüber einem Server (z. B. VPN, Intranet)

Kommandozeilenwerkzeuge für digitale Zertifikate

Die meisten Entwicklerinnen und Entwickler kennen das Kommandozeilenwerkzeug MakeCert.exe https://learn.microsoft.com/de-de/windows/win32/seccrypto/makecert, um ein digitales Test-Zertifikat zu erstellen und certutil.exe https://learn.microsoft.com/de-de/windows-server/administration/windows-commands/certutil, um Zertifikate aufzulisten, z.B.
eigene Zertifikate im Benutzerkonto
certutil -user -store My
oder Zertifikate im lokalen Computerkonto
certutil -store My
oder vertrauenswürdige Stammzertifizierungsstellen
certutil -store Root

Digitale Zertifikat in .NET

In der .NET-Klassenbibliothek sind Klassen enthalten, um Zertifikate zu prüfen, zu erstellen, zu installieren und die vorhandenen Zertifikate aufzulisten.

Zertifikate auflisten

Die Klasse System.Security.Cryptography.X509Certificates.X509Store in der System.Security.Cryptography.dll gibt es seit .NET Framework 2.0 und .NET Core 1.0. Im Konstruktor gibt man den StoreName (z.B. My, Root, TrustedPublisher) und die StoreLocation (Auswahl hier nur CurrentUser oder LocalMachine) an. Nach einem Aufruf von Open() kann man die Liste der Zertifikate in der Eigenschaft Certificates abrufen und ggf. mit LINQ filtern, wie das Listing 1 zeigt.

Listing 1: Liste aller installierten eigenen Zertifikate mit Namen "TestZertifikat" im Benutzerkonto
public static void PrintCerts()
{
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);

var certs = store.Certificates.Where(x => x.Issuer.Contains("TestZertifikat"));
foreach (var cert in certs)
{
Console.WriteLine(cert.Issuer + " gültig bis " + cert.GetExpirationDateString());
}
store.Close();
}

Selbst-signierte Zertifikate erstellen

Als Ersatz für MakeCert.exe kann man die Klasse System.Security.Cryptography.X509Certificates.CertificateRequest verwenden, die es sei .NET Framework 4.7.2 und .NET Core 2.0 gibt. Listing 2 zeigt zunächst die Erstellung eines RSA-Schlüsselpaars. RSA steht für ein asymmetrisches Kryptosystem, das 1977 von Rivest, Shamir und Adleman entwickelt wurde. Mit den Schlüsseln wird ein CertificateRequest-Objekt erzeugt, dem dann verschiedene Zwecke (sogenannte Key Usage Extensions) mit Add() hinzugefügt werden:
  • DigitalSignature: Der Schlüssel darf zur digitalen Signatur verwendet werden, z. B. zur Signierung von Daten oder TLS-Handshakes.
  • KeyEncipherment: Der Schlüssel darf zur Verschlüsselung anderer Schlüssel verwendet werden, z. B. bei TLS zum Austausch von symmetrischen Sitzungsschlüsseln.
  • Serverauthentifizierung: Ohne diese Enhanced Key Usage Extensions wird ein Zertifikat von vielen Clients (z. B. Browsern) nicht als gültig für TLS-Serverzwecke anerkannt, selbst wenn die DigitalSignature und KeyEncipherment bereits gesetzt sind.
Das Zertifikat wird dann mit CreateSelfSigned() erzeugt mit einer Gültigkeit von zwei Jahren. Zum Abschluss wird das Zertifikat als PFX-Datei abgespeichert.

Listing 2: Erstellen eines selbst-signierten Zertifikats für Serverauthentifizierung
public static void CreateCert()
{
string certPath = @"t:\testcert.pfx";
string certPassword = "geheim";

try
{
// RSA-Schlüsselpaar generieren
using (RSA rsa = RSA.Create(2048))
{
var request = new CertificateRequest(
"CN=MeinTestZertifikat_" + DateTime.Now, // Common Name (CN)
rsa,
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1);

// Erweiterungen hinzufügen (z.B. für Serverauthentifizierung)
request.CertificateExtensions.Add(
new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.KeyEncipherment, false));

request.CertificateExtensions.Add(
new X509EnhancedKeyUsageExtension(
new OidCollection { new Oid("1.3.6.1.5.5.7.3.1") }, // OID für Serverauth
false));

// Selbstsigniertes Zertifikat mit einer Gültigkeit von zwei Jahren erstellen
X509Certificate2 certificate = request.CreateSelfSigned(
DateTimeOffset.Now,
DateTimeOffset.Now.AddYears(2));

// Export des Zertifikats in PFX-Format (inkl. privatem Schlüssel)
byte[] pfxBytes = certificate.Export(X509ContentType.Pfx, certPassword);
File.WriteAllBytes(certPath, pfxBytes);

Console.WriteLine($"PFX-Zertifikat erfolgreich erstellt: {certPath}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Fehler beim Erstellen des Zertifikats: {ex.Message}");
}
}

Zertifikate installieren

Nun gilt es noch, das erzeugte Zertifikat im Zertifikatsspeicher zu installieren. Der aktuelle Weg (seit .NET 8.0) zum Laden eines Zertifikats aus einer PFX-Datei ist die Klasse System.Security.Cryptography.X509Certificates.X509CertificateLoader.
X509Certificate2 certificate = X509CertificateLoader.LoadPkcs12FromFile(certPath, certPassword);

Die Klasse X509Certificate stellt grundlegende Informationen über ein X.509-Zertifikat bereit, aber bietet keinen Zugriff auf den privaten Schlüssel und keine Zertifikatserweiterungen. Dafür braucht man dann die abgeleitete Klasse X509Certificate2. Beide Klassen gibt es seit .NET Framework 1.1 und .NET Core 1.0.

Bevor es die X509CertificateLoader gab, hat man direkt den Konstruktor der Klasse X509Certificate2 verwendet, siehe Listing 3.

Das geladene Zertifikat übergibt man dann mit Add() einem X509Store-Objekt, welche zuvor mit OpenFlags.ReadWrite zum Lesen und Ändern geöffnet wurde.

Listing 3: Installieren eines Zertifikats aus einer PFX-Datei im lokalen Zertifikatsspeicher
public static void InstallCert()
{

string certPath = @"t:\testcert.pfx"; // Pfad zur Zertifikatsdatei
string certPassword = "geheim"; // Passwort für das Zertifikat

try
{
// Zertifikat aus Datei laden
// Veralterte Methode:
//X509Certificate2 certificate = new X509Certificate2(certPath, certPassword,
//X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
X509Certificate2 certificate = X509CertificateLoader.LoadPkcs12FromFile(certPath, certPassword);

// Zertifikat im Zertifikatsspeicher hinzufügen (z.B. für lokale Maschine / My)
using (X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);
store.Close();
}

Console.WriteLine("Zertifikat erfolgreich installiert.");
}
catch (Exception ex)
{
Console.WriteLine($"Fehler beim Installieren des Zertifikats: {ex.Message}");
}
}

Beratung & Support

Schulungen

  Anfrage für eine individuelle Schulung zum Thema DIGITALES ZERTIFIKAT   Gesamter Schulungsthemenkatalog

Fachbücher

  Alle unsere aktuellen Fachbücher   E-Book-Abo für ab 99 Euro im Jahr