So lesen Sie das Zertifikat des Unterzeichners aus verifizierten PDF-Signaturen in C# (X.509, eIDAS, Chain)

This article was translated from English: Does it need improvement?
Translated
View the article in English

Ein Vertrag landet in Ihrer Audit-Pipeline. Er ist digital signiert, die Signatur ist gültig, und Ihr Compliance-Team benötigt Antworten: Wer hat ihn signiert, war dessen Zertifikat an diesem Morgen gültig, und stimmt die ausstellende Zertifizierungsstelle mit Ihrer Liste vertrauenswürdiger Zertifizierungsstellen überein? Sie könnten die rohen Signatur-Bytes extrahieren, das DER-Format analysieren und die Zertifikatskette manuell durchgehen. Oder Sie könnten das VerifiedSignature-Objekt nach seinem SignerCertificate fragen und die Antworten als Eigenschaften auslesen.

Genau dafür sind die Eigenschaften SignerCertificate und CertificateChain von VerifiedSignature vorgesehen. Zurückgegeben von PdfDocument.GetVerifiedSignatures(), geben sie die vollständige X.509-Identität des Unterzeichners, die ausstellende Zertifizierungsstelle, Gültigkeitsdaten, den SHA-256-Fingerabdruck, die rohen DER-Bytes und jedes Zwischenzertifikat bis zur Stammzertifizierungsstelle preis. Das ist die API-Oberfläche, die Sie für eIDAS-Konformität, Zertifikat-Pinning, Prüfpfade und die Überprüfung der Vertrauenskette benötigen.

Dieser Leitfaden führt durch drei Arten der Zertifikatsprüfung:

  • Standard-X.509-Details: Identitätsmerkmale, vollständige Distinguished Names, Gültigkeitszeiträume und rohe DER-Bytes für X509Certificate2-Interoperabilität.
  • eIDAS und regulierte Branchen: Abrufen der nationalen ID des Unterzeichners aus SubjectSerialNumber und Lesen numerischer OIDs wie 2.5.4.97 für den eIDAS-OrganizationIdentifier.
  • Validierung der Vertrauenskette: SHA-256-Thumbprint-Pinning und Durchlaufen der gesamten Kette vom Unterzeichner bis zur Stamm-Zertifizierungsstelle.

Starten Sie eine kostenlose 30-Tage-Testversion, um die Zertifikatsprüfung in Ihrer Verifizierungspipeline zu testen.

NuGet Mit NuGet installieren

PM >  Install-Package IronPdf

Schauen Sie sich IronPDF auf NuGet für eine schnelle Installation an. Mit über 10 Millionen Downloads transformiert es die PDF-Entwicklung mit C#. Sie können auch das DLL oder den Windows Installer herunterladen.

Schnellstart: Lesen des Zertifikats des Unterzeichners aus einer signierten PDF-Datei

Rufen Sie GetVerifiedSignatures für eine geladene PDF-Datei auf und lesen Sie die Zertifikateigenschaften des Unterzeichners direkt aus dem Ergebnis aus.

  1. Installieren Sie IronPDF mit NuGet Package Manager

    PM > Install-Package IronPdf
  2. Kopieren Sie diesen Codeausschnitt und führen Sie ihn aus.

    var sig = PdfDocument.FromFile("signed.pdf").GetVerifiedSignatures().First();
    var cert = sig.SignerCertificate;
    Console.WriteLine($"{cert?.CommonName} ({cert?.Organization}) valid until {cert?.NotAfter}");
  3. Bereitstellen zum Testen in Ihrer Live-Umgebung

    Beginnen Sie noch heute, IronPDF in Ihrem Projekt zu verwenden, mit einer kostenlosen Testversion

    arrow pointer


Wie extrahiert man die nationale oder persönliche ID des Unterzeichners?

Die Eigenschaft SubjectSerialNumber gibt den Wert der OID "SERIALNUMBER" aus dem Subject-DN des Zertifikats zurück. In regulierten Branchen (eIDAS-qualifizierte Zertifikate, Bankwesen, von Behörden ausgestellte digitale Ausweise) enthält dieses Feld die nationale Identifikationsnummer, die Steuernummer oder die persönliche Identifikationsnummer des Unterzeichners. Es handelt sich nicht um die Seriennummer des Zertifikats selbst; Das ist CertificateSerialNumber.

:path=/static-assets/pdf/content-code-examples/how-to/verify-pdf-signatures-serial-number.cs
using IronPdf;
using IronPdf.Signing.Inspection;

var pdf = PdfDocument.FromFile("eidas-signed-invoice.pdf");

foreach (var sig in pdf.GetVerifiedSignatures())
{
    var cert = sig.SignerCertificate;
    if (cert is null) continue;

    // Subject DN SERIALNUMBER OID (national ID, tax ID, etc.)
    Console.WriteLine($"Signer Identity (SERIALNUMBER): {cert.SubjectSerialNumber ?? "not present"}");

    // Certificate's own serial from the issuing CA
    Console.WriteLine($"Certificate Serial (CA-issued):  {cert.CertificateSerialNumber}");
}
Imports IronPdf
Imports IronPdf.Signing.Inspection

Dim pdf = PdfDocument.FromFile("eidas-signed-invoice.pdf")

For Each sig In pdf.GetVerifiedSignatures()
    Dim cert = sig.SignerCertificate
    If cert Is Nothing Then Continue For

    ' Subject DN SERIALNUMBER OID (national ID, tax ID, etc.)
    Console.WriteLine($"Signer Identity (SERIALNUMBER): {If(cert.SubjectSerialNumber, "not present")}")

    ' Certificate's own serial from the issuing CA
    Console.WriteLine($"Certificate Serial (CA-issued):  {cert.CertificateSerialNumber}")
Next
$vbLabelText   $csharpLabel

TippsKurze Erinnerung zum Unterschied zwischen diesen beiden: SubjectSerialNumber gibt an, wer das Dokument signiert hat (eine Personen- oder Organisations-ID, wie eine nationale ID oder Steuernummer, die in den Subject DN eingebettet ist). CertificateSerialNumber gibt an, welches Zertifikat verwendet wurde; (Es handelt sich um die eindeutige Seriennummer, die die ausstellende Zertifizierungsstelle für Sperrlisten und Audit-Protokolle vergibt.

Wie greift man auf Convenience-Identity-Eigenschaften zu?

SignerCertificateInfo stellt die am häufigsten benötigten Subject-DN-Felder als direkte Eigenschaften bereit, sodass Sie die vollständige DN-Zeichenkette nicht selbst parsen müssen.

Lesen des Namens und der Zugehörigkeit des Unterzeichners

Die Eigenschaften CommonName, Organization, Country und Email decken ab, worauf die meisten Identitäts-Workflows als Erstes zurückgreifen.

:path=/static-assets/pdf/content-code-examples/how-to/verify-pdf-signatures-identity-common.cs
using IronPdf;
using IronPdf.Signing.Inspection;

var pdf = PdfDocument.FromFile("signed-agreement.pdf");

foreach (var sig in pdf.GetVerifiedSignatures())
{
    var cert = sig.SignerCertificate;
    if (cert is null) continue;

    // Common Subject DN fields exposed directly as properties
    Console.WriteLine($"CommonName (CN):  {cert.CommonName}");
    Console.WriteLine($"Organization (O): {cert.Organization}");
    Console.WriteLine($"Country (C):      {cert.Country}");
    Console.WriteLine($"Email:            {cert.Email}");
}
Imports IronPdf
Imports IronPdf.Signing.Inspection

Dim pdf = PdfDocument.FromFile("signed-agreement.pdf")

For Each sig In pdf.GetVerifiedSignatures()
    Dim cert = sig.SignerCertificate
    If cert Is Nothing Then Continue For

    ' Common Subject DN fields exposed directly as properties
    Console.WriteLine($"CommonName (CN):  {cert.CommonName}")
    Console.WriteLine($"Organization (O): {cert.Organization}")
    Console.WriteLine($"Country (C):      {cert.Country}")
    Console.WriteLine($"Email:            {cert.Email}")
Next
$vbLabelText   $csharpLabel

Die Eigenschaft Email überprüft zunächst den Subject-DN auf die OID emailAddress. Falls nicht vorhanden, wird auf die Subject Alternative Name (SAN)-Erweiterung rfc822Name zurückgegriffen. Die Eigenschaft Country gibt den zweistelligen ISO 3166-1 Alpha-2-Code zurück (zum Beispiel "DE", "US", "FR"). Alle Komfort-Eigenschaften geben null zurück, wenn das entsprechende Feld im Zertifikat nicht vorhanden ist.

Lesen Sie den vollständigen DN, wenn Sie alles wissen möchten

Für Audit-Protokollierung, nachgelagertes Parsing oder Compliance-Berichte geben SubjectDN und IssuerDN die vollständigen Distinguished Name-Zeichenfolgen zurück.

:path=/static-assets/pdf/content-code-examples/how-to/verify-pdf-signatures-identity-full-dn.cs
using IronPdf;
using IronPdf.Signing.Inspection;

var pdf = PdfDocument.FromFile("signed-agreement.pdf");

foreach (var sig in pdf.GetVerifiedSignatures())
{
    var cert = sig.SignerCertificate;
    if (cert is null) continue;

    // Full DN strings for audit logging or downstream parsing
    Console.WriteLine($"Full Subject DN: {cert.SubjectDN}");
    Console.WriteLine($"Full Issuer DN:  {cert.IssuerDN}");
}
Imports IronPdf
Imports IronPdf.Signing.Inspection

Dim pdf = PdfDocument.FromFile("signed-agreement.pdf")

For Each sig In pdf.GetVerifiedSignatures()
    Dim cert = sig.SignerCertificate
    If cert Is Nothing Then Continue For

    ' Full DN strings for audit logging or downstream parsing
    Console.WriteLine($"Full Subject DN: {cert.SubjectDN}")
    Console.WriteLine($"Full Issuer DN:  {cert.IssuerDN}")
Next
$vbLabelText   $csharpLabel

Wie extrahiert man beliebige Betreff- und Absenderfelder?

Die Methoden GetSubjectField(string) und GetIssuerField(string) akzeptieren entweder Kurznamen oder numerische OIDs. Sie sind groß-/kleinschreibungsunabhängig und geben null zurück, wenn das Feld nicht vorhanden ist.

Unterstützte Kurznamen: CN, O, OU, C, L, ST, E, SERIALNUMBER, SURNAME, T, GIVENNAME, UID, ORGANIZATIONIDENTIFIER.

Lesen beliebiger Themenbereiche (einschließlich eIDAS-OIDs)

Übergeben Sie einen Kurznamen wie "OU" oder eine numerische OID wie "2.5.4.97" (den eIDAS-Organisationsidentifikator), um ein beliebiges Feld aus dem Subject-DN abzurufen.

:path=/static-assets/pdf/content-code-examples/how-to/verify-pdf-signatures-field-subject.cs
using IronPdf;
using IronPdf.Signing.Inspection;

var pdf = PdfDocument.FromFile("eidas-contract.pdf");

foreach (var sig in pdf.GetVerifiedSignatures())
{
    var cert = sig.SignerCertificate;
    if (cert is null) continue;

    // Short-name lookups (case-insensitive)
    string? orgUnit = cert.GetSubjectField("OU");
    string? surname = cert.GetSubjectField("SURNAME");
    string? givenName = cert.GetSubjectField("GIVENNAME");
    string? title = cert.GetSubjectField("T");

    // Numeric OID lookup (eIDAS organizationIdentifier)
    string? orgId = cert.GetSubjectField("2.5.4.97");

    Console.WriteLine($"Name: {givenName} {surname} ({title}), OU: {orgUnit}");
    Console.WriteLine($"eIDAS Org ID (2.5.4.97): {orgId ?? "not present"}");
}
Imports IronPdf
Imports IronPdf.Signing.Inspection

Dim pdf = PdfDocument.FromFile("eidas-contract.pdf")

For Each sig In pdf.GetVerifiedSignatures()
    Dim cert = sig.SignerCertificate
    If cert Is Nothing Then Continue For

    ' Short-name lookups (case-insensitive)
    Dim orgUnit As String = cert.GetSubjectField("OU")
    Dim surname As String = cert.GetSubjectField("SURNAME")
    Dim givenName As String = cert.GetSubjectField("GIVENNAME")
    Dim title As String = cert.GetSubjectField("T")

    ' Numeric OID lookup (eIDAS organizationIdentifier)
    Dim orgId As String = cert.GetSubjectField("2.5.4.97")

    Console.WriteLine($"Name: {givenName} {surname} ({title}), OU: {orgUnit}")
    Console.WriteLine($"eIDAS Org ID (2.5.4.97): {If(orgId, "not present")}")
Next
$vbLabelText   $csharpLabel

Die numerische OID-Suche ist für eIDAS- und regulierte Branchenzertifikate unerlässlich, die Organisationskennungen, professionelle Qualifikationen oder rechtsraumspezifische Felder enthalten, die nicht durch Standard-Kurznamen abgedeckt sind.

Lesen der Felder des Ausstellers

GetIssuerField funktioniert auf die gleiche Weise in Bezug auf den Distinguished Name der ausstellenden Zertifizierungsstelle. Dies ist nützlich für die Vertrauensvalidierung, die CA-Berichterstattung und die Gruppierung von Signaturen nach ihrer ausstellenden Stelle.

:path=/static-assets/pdf/content-code-examples/how-to/verify-pdf-signatures-field-issuer.cs
using IronPdf;
using IronPdf.Signing.Inspection;

var pdf = PdfDocument.FromFile("eidas-contract.pdf");

foreach (var sig in pdf.GetVerifiedSignatures())
{
    var cert = sig.SignerCertificate;
    if (cert is null) continue;

    // GetIssuerField works the same way as GetSubjectField
    string? issuerCN = cert.GetIssuerField("CN");
    string? issuerO = cert.GetIssuerField("O");
    string? issuerCountry = cert.GetIssuerField("C");

    Console.WriteLine($"Issued by: {issuerCN} ({issuerO}, {issuerCountry})");
}
Imports IronPdf
Imports IronPdf.Signing.Inspection

Dim pdf = PdfDocument.FromFile("eidas-contract.pdf")

For Each sig In pdf.GetVerifiedSignatures()
    Dim cert = sig.SignerCertificate
    If cert Is Nothing Then Continue For

    ' GetIssuerField works the same way as GetSubjectField
    Dim issuerCN As String = cert.GetIssuerField("CN")
    Dim issuerO As String = cert.GetIssuerField("O")
    Dim issuerCountry As String = cert.GetIssuerField("C")

    Console.WriteLine($"Issued by: {issuerCN} ({issuerO}, {issuerCountry})")
Next
$vbLabelText   $csharpLabel

Wie überprüft man die Gültigkeit eines Zertifikats?

SignerCertificateInfo bietet zwei Validierungshilfen:

  • IsExpired gibt true zurück, wenn DateTime.UtcNow > NotAfter.
  • IsValidAt(DateTime) gibt true zurück, wenn der angegebene Zeitstempel in das Zeitfenster NotAfter von Windows fällt. Die typische Verwendung besteht darin, zu überprüfen, ob das Zertifikat zum Zeitpunkt der Signierung gültig war.
:path=/static-assets/pdf/content-code-examples/how-to/verify-pdf-signatures-validity.cs
using IronPdf;
using IronPdf.Signing.Inspection;

var pdf = PdfDocument.FromFile("archived-contract.pdf");

foreach (var sig in pdf.GetVerifiedSignatures())
{
    var cert = sig.SignerCertificate;
    if (cert is null) continue;

    Console.WriteLine($"Valid from:  {cert.NotBefore}");
    Console.WriteLine($"Valid until: {cert.NotAfter}");
    Console.WriteLine($"Expired now: {cert.IsExpired}");

    // Confirm certificate was valid when the document was signed
    if (sig.SigningDate.HasValue)
    {
        bool validAtSigning = cert.IsValidAt(sig.SigningDate.Value);
        Console.WriteLine($"Valid at signing time ({sig.SigningDate.Value}): {validAtSigning}");
    }
}
Imports IronPdf
Imports IronPdf.Signing.Inspection

Dim pdf = PdfDocument.FromFile("archived-contract.pdf")

For Each sig In pdf.GetVerifiedSignatures()
    Dim cert = sig.SignerCertificate
    If cert Is Nothing Then Continue For

    Console.WriteLine($"Valid from:  {cert.NotBefore}")
    Console.WriteLine($"Valid until: {cert.NotAfter}")
    Console.WriteLine($"Expired now: {cert.IsExpired}")

    ' Confirm certificate was valid when the document was signed
    If sig.SigningDate.HasValue Then
        Dim validAtSigning As Boolean = cert.IsValidAt(sig.SigningDate.Value)
        Console.WriteLine($"Valid at signing time ({sig.SigningDate.Value}): {validAtSigning}")
    End If
Next
$vbLabelText   $csharpLabel

TippsIsExpired gibt false (nicht true) zurück, wenn Gültigkeitsdaten nicht aus dem Zertifikat extrahiert werden können. Der Helper ist bewusst konservativ; er geht nicht davon aus, dass etwas abgelaufen ist, nur weil Metadaten fehlen. Bei Zero-Trust-Workflows sind fehlende Gültigkeitsdaten ausdrücklich als Fehlerfall zu behandeln.

Für Prüfpfade protokollieren Sie sowohl die IsExpired-Prüfung (aktuelle Gültigkeit) als auch die IsValidAt(signingDate)-Prüfung (Gültigkeit zum Zeitpunkt der Signierung). Ein Zertifikat, das inzwischen abgelaufen ist, war zum Zeitpunkt der Unterzeichnung des Dokuments möglicherweise noch gültig; Beide Datenpunkte sind für die Compliance von Bedeutung.

Wie verwendet man den SHA-256-Fingerabdruck für das Certificate Pinning?

Die Eigenschaft Sha256Thumbprint gibt eine 64 Zeichen lange Hexadezimalzeichenfolge in Großbuchstaben zurück, den SHA-256-Hash des DER-kodierten Zertifikats. Dies ist der Wert, den Sie mit einer Liste bekannter, vertrauenswürdiger Signaturzertifikate abgleichen.

:path=/static-assets/pdf/content-code-examples/how-to/verify-pdf-signatures-thumbprint-pinning.cs
using IronPdf;
using IronPdf.Signing.Inspection;
using System.Collections.Generic;

// Known-good signer thumbprints from a compliance database
var pinnedThumbprints = new HashSet<string>
{
    "A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2",
    "F6E5D4C3B2A1F6E5D4C3B2A1F6E5D4C3B2A1F6E5D4C3B2A1F6E5D4C3B2A1F6E5"
};

var pdf = PdfDocument.FromFile("submitted-form.pdf");

foreach (var sig in pdf.GetVerifiedSignatures())
{
    var cert = sig.SignerCertificate;
    if (cert is null) continue;

    // Pin against trusted thumbprint list
    bool trusted = pinnedThumbprints.Contains(cert.Sha256Thumbprint);
    Console.WriteLine($"Signer: {cert.CommonName}, Thumbprint: {cert.Sha256Thumbprint}");
    Console.WriteLine($"Pinned: {trusted}");
}
Imports IronPdf
Imports IronPdf.Signing.Inspection
Imports System.Collections.Generic

' Known-good signer thumbprints from a compliance database
Dim pinnedThumbprints As New HashSet(Of String) From {
    "A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2",
    "F6E5D4C3B2A1F6E5D4C3B2A1F6E5D4C3B2A1F6E5D4C3B2A1F6E5D4C3B2A1F6E5"
}

Dim pdf = PdfDocument.FromFile("submitted-form.pdf")

For Each sig In pdf.GetVerifiedSignatures()
    Dim cert = sig.SignerCertificate
    If cert Is Nothing Then Continue For

    ' Pin against trusted thumbprint list
    Dim trusted As Boolean = pinnedThumbprints.Contains(cert.Sha256Thumbprint)
    Console.WriteLine($"Signer: {cert.CommonName}, Thumbprint: {cert.Sha256Thumbprint}")
    Console.WriteLine($"Pinned: {trusted}")
Next
$vbLabelText   $csharpLabel

Wie erstellt man ein X509Certificate2 aus Rohdaten eines Zertifikats?

Die Eigenschaft RawData gibt das DER-kodierte Zertifikat als byte[] zurück. Jeder Aufruf gibt eine defensive Kopie zurück, sodass die internen Daten niemals per Referenz offengelegt werden. Sie können dies verwenden, um ein System.Security.Cryptography.X509Certificates.X509Certificate2 für die Interoperabilität mit den nativen kryptografischen APIs von .NET zu erstellen (Kettenaufbau, Richtlinienvalidierung, CRL-Prüfung).

:path=/static-assets/pdf/content-code-examples/how-to/verify-pdf-signatures-x509-interop.cs
using IronPdf;
using IronPdf.Signing.Inspection;
using System.Security.Cryptography.X509Certificates;

var pdf = PdfDocument.FromFile("signed-report.pdf");

foreach (var sig in pdf.GetVerifiedSignatures())
{
    var cert = sig.SignerCertificate;
    if (cert is null) continue;

    // Construct X509Certificate2 from defensive DER copy
    byte[] derBytes = cert.RawData;
    var x509 = new X509Certificate2(derBytes);

    Console.WriteLine($"X509 Subject:    {x509.Subject}");
    Console.WriteLine($"X509 Issuer:     {x509.Issuer}");
    Console.WriteLine($"X509 Serial:     {x509.SerialNumber}");
    Console.WriteLine($"X509 Algorithm:  {x509.SignatureAlgorithm.FriendlyName}");
    Console.WriteLine($"X509 Key Size:   {x509.PublicKey.Key.KeySize} bits");
}
Imports IronPdf
Imports IronPdf.Signing.Inspection
Imports System.Security.Cryptography.X509Certificates

Dim pdf = PdfDocument.FromFile("signed-report.pdf")

For Each sig In pdf.GetVerifiedSignatures()
    Dim cert = sig.SignerCertificate
    If cert Is Nothing Then Continue For

    ' Construct X509Certificate2 from defensive DER copy
    Dim derBytes As Byte() = cert.RawData
    Dim x509 = New X509Certificate2(derBytes)

    Console.WriteLine($"X509 Subject:    {x509.Subject}")
    Console.WriteLine($"X509 Issuer:     {x509.Issuer}")
    Console.WriteLine($"X509 Serial:     {x509.SerialNumber}")
    Console.WriteLine($"X509 Algorithm:  {x509.SignatureAlgorithm.FriendlyName}")
    Console.WriteLine($"X509 Key Size:   {x509.PublicKey.Key.KeySize} bits")
Next
$vbLabelText   $csharpLabel

Hinweis:Jeder Zugriff auf RawData gibt eine neue defensive Kopie zurück. Das interne Byte-Array wird niemals per Referenz offengelegt, sodass eine Änderung der zurückgegebenen Bytes keine Auswirkungen auf spätere Aufrufe hat.

Über diesen Interop-Pfad können Sie die Signaturprüfung von IronPDF in bestehende .NET-Zertifikatsvalidierungspipelines integrieren, wie z. B. X509Chain.Build(), die Sperrlistenprüfung über CRL/OCSP oder benutzerdefinierte X509CertificateValidator-Implementierungen.

Wie durchläuft man die Zertifikatskette?

Die Eigenschaft CertificateChain auf VerifiedSignature gibt eine IReadOnlyList<SignerCertificateInfo> zurück, die in der Reihenfolge Unterzeichner → Zwischen-Zertifizierungsstelle(n) → Stamm-Zertifizierungsstelle angeordnet ist. Index 0 ist immer das Signaturzertifikat (dasselbe Objekt wie SignerCertificate). Die Liste ist niemals null; Wenn die Kette nicht extrahiert werden kann, enthält sie nur das Zertifikat des Unterzeichners.

:path=/static-assets/pdf/content-code-examples/how-to/verify-pdf-signatures-chain-walking.cs
using IronPdf;
using IronPdf.Signing.Inspection;

var pdf = PdfDocument.FromFile("enterprise-signed.pdf");

foreach (var sig in pdf.GetVerifiedSignatures())
{
    Console.WriteLine($"--- Signature: {sig.SignatureName} ---");
    Console.WriteLine($"Chain length: {sig.CertificateChain.Count}");

    // Walk from signer (index 0) through intermediates to root CA
    for (int i = 0; i < sig.CertificateChain.Count; i++)
    {
        var cert = sig.CertificateChain[i];
        string role = i == 0 ? "Signer"
                    : i == sig.CertificateChain.Count - 1 ? "Root CA"
                    : $"Intermediate CA ({i})";

        Console.WriteLine($"  [{role}]");
        Console.WriteLine($"    Subject:     {cert.SubjectDN}");
        Console.WriteLine($"    Issuer:      {cert.IssuerDN}");
        Console.WriteLine($"    Serial:      {cert.CertificateSerialNumber}");
        Console.WriteLine($"    Valid:       {cert.NotBefore} to {cert.NotAfter}");
        Console.WriteLine($"    Expired:     {cert.IsExpired}");
        Console.WriteLine($"    Thumbprint:  {cert.Sha256Thumbprint}");
    }
}
Imports IronPdf
Imports IronPdf.Signing.Inspection

Dim pdf = PdfDocument.FromFile("enterprise-signed.pdf")

For Each sig In pdf.GetVerifiedSignatures()
    Console.WriteLine($"--- Signature: {sig.SignatureName} ---")
    Console.WriteLine($"Chain length: {sig.CertificateChain.Count}")

    ' Walk from signer (index 0) through intermediates to root CA
    For i As Integer = 0 To sig.CertificateChain.Count - 1
        Dim cert = sig.CertificateChain(i)
        Dim role As String = If(i = 0, "Signer", If(i = sig.CertificateChain.Count - 1, "Root CA", $"Intermediate CA ({i})"))

        Console.WriteLine($"  [{role}]")
        Console.WriteLine($"    Subject:     {cert.SubjectDN}")
        Console.WriteLine($"    Issuer:      {cert.IssuerDN}")
        Console.WriteLine($"    Serial:      {cert.CertificateSerialNumber}")
        Console.WriteLine($"    Valid:       {cert.NotBefore} to {cert.NotAfter}")
        Console.WriteLine($"    Expired:     {cert.IsExpired}")
        Console.WriteLine($"    Thumbprint:  {cert.Sha256Thumbprint}")
    Next
Next
$vbLabelText   $csharpLabel

Hinweis:Jedes SignerCertificateInfo in der Kette legt dieselben Eigenschaften offen wie SignerCertificate: Identitätsfelder, Gültigkeit, Fingerabdruck, RawData, GetSubjectField() und GetIssuerField(). Sie können das Ablaufdatum jeder Zwischen-CA überprüfen, den Fingerabdruck der Root-CA mit Ihrem vertrauenswürdigen Root-Speicher abgleichen und die gesamte Kette für Compliance-Audits protokollieren.

Nächste Schritte

SignerCertificate und CertificateChain bieten Ihnen eine vollständige X.509-Prüfung, ohne dass Sie die IronPDF-API-Oberfläche verlassen müssen. Von hier aus sind die nächsten logischen Schritte eine vertiefte Betrachtung der Teile von IronPDF, in die diese Komponenten eingebunden sind.

Für den Signaturteil des Workflows behandelt die Anleitung zu digitalen Signaturen die Erstellung von Zertifikaten, Metadaten und inkrementelles Signieren. Für die HSM-basierte Signatur in Hochsicherheitsumgebungen behandelt der HSM-Signaturleitfaden die PKCS#11-Integration. Benötigen Sie einsatzbereite Code-Schnipsel? Das Code-Beispiel für digitale Signaturen liefert diese.

Sind Sie bereit, es an Ihren eigenen signierten PDFs auszuprobieren? Starten Sie Ihre kostenlose 30-Tage-Testversion oder sehen Sie sich die Lizenzoptionen an.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Bereit anzufangen?
Nuget Downloads 18,918,602 | Version: 2026.5 just released
Still Scrolling Icon

Scrollst du immer noch?

Sie brauchen schnell einen Beweis? PM > Install-Package IronPdf
Führen Sie eine Probe aus Sehen Sie zu, wie Ihr HTML-Code in eine PDF-Datei umgewandelt wird.