Jak odczytać certyfikat podpisującego z zweryfikowanych podpisów PDF w języku C# (X.509, eIDAS, łańcuch)

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

Umowa trafia do Twojego procesu audytu. Jest podpisana cyfrowo, podpis jest ważny, a Twój zespół ds. zgodności potrzebuje odpowiedzi: kto ją podpisał, czy certyfikat tej osoby był ważny tego ranka i czy certyfikacyjny organ wydający (CA) znajduje się na Twojej liście zaufanych podmiotów? Możesz pobrać surowe bajty podpisu, przeanalizować format DER i ręcznie przejrzeć łańcuch certyfikatów. Można też zapytać obiekt VerifiedSignature o jego SignerCertificate i odczytać odpowiedzi jako właściwości.

Właśnie do tego służą właściwości SignerCertificate i CertificateChain w VerifiedSignature. Zwracane z PdfDocument.GetVerifiedSignatures(), ujawniają pełną tożsamość X.509 podpisującego, certyfikujący organ wydający, daty ważności, odcisk palca SHA-256, surowe bajty DER oraz każdy certyfikat pośredni aż do certyfikatu głównego. To jest interfejs API, którego potrzebujesz do zapewnienia zgodności z eIDAS, przypisywania certyfikatów, ścieżek audytu i weryfikacji łańcucha zaufania.

W niniejszym przewodniku omówiono trzy rodzaje kontroli certyfikatów:

  • Standardowe szczegóły X.509: właściwości tożsamości, pełne nazwy wyróżniające, okresy ważności oraz surowe bajty DER dla interoperacyjności X509Certificate2.
  • eIDAS i branże podlegające regulacjom: pobieranie numeru identyfikacyjnego podpisującego z SubjectSerialNumber oraz odczytywanie numerycznych identyfikatorów OID, takich jak 2.5.4.97, dla identyfikatora organizacji eIDAS.
  • Weryfikacja łańcucha zaufania: przypisanie odcisku SHA-256 i prześledzenie pełnego łańcucha od podpisującego do głównego certyfikatu CA.

Rozpocznij bezpłatny 30-dniowy okres probny, aby przetestować sprawdzanie certyfikatów w swoim procesie weryfikacji.

NuGet Zainstaluj za pomocą NuGet

PM >  Install-Package IronPdf

Sprawdź IronPDF na NuGet dla szybkiej instalacji. Z ponad 10 milionami pobrań, przekształca rozwój PDF z C#. Możesz również pobrać DLL lub instalator Windows.

Szybki start: Odczytanie certyfikatu podpisującego z podpisanego pliku PDF

Wywołaj GetVerifiedSignatures na załadowanym pliku PDF i odczytaj właściwości certyfikatu podpisującego bezpośrednio z wyniku.

  1. Install IronPDF with NuGet Package Manager

    PM > Install-Package IronPdf
  2. Skopiuj i uruchom ten fragment kodu.

    var sig = PdfDocument.FromFile("signed.pdf").GetVerifiedSignatures().First();
    var cert = sig.SignerCertificate;
    Console.WriteLine($"{cert?.CommonName} ({cert?.Organization}) valid until {cert?.NotAfter}");
  3. Wdrożenie do testowania w środowisku produkcyjnym

    Rozpocznij używanie IronPDF w swoim projekcie już dziś z darmową wersją próbną

    arrow pointer


Jak wyodrębnić numer identyfikacyjny lub numer osobowy podpisującego?

Właściwość SubjectSerialNumber zwraca wartość OID SERIALNUMBER z DN podmiotu certyfikatu. W branżach podlegających regulacjom (certyfikaty kwalifikowane eIDAS, bankowość, identyfikatory cyfrowe wydawane przez rząd) w tym polu umieszczany jest numer identyfikacyjny, numer identyfikacji podatkowej lub numer identyfikacyjny osoby fizycznej. Nie jest to numer seryjny samego certyfikatu; czyli 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

PoradyKrótkie przypomnienie dotyczące różnicy między tymi dwoma: SubjectSerialNumber informuje, kto podpisał dokument (identyfikator osoby lub organizacji, taki jak numer identyfikacyjny lub numer podatkowy osadzony w Subject DN). CertificateSerialNumber informuje, który certyfikat został użyty; jest to unikalny numer seryjny przypisany przez certyfikujący organ wydający do list unieważnień i dzienników audytowych.

Jak uzyskać dostęp do właściwości tożsamości wygody?

SignerCertificateInfo udostępnia najczęściej potrzebne pola DN podmiotu jako bezpośrednie właściwości, dzięki czemu nie trzeba samodzielnie analizować całego ciągu DN.

Odczytanie nazwiska i afiliacji osoby podpisującej

Właściwości CommonName, Organization, Country i Email obejmują to, do czego najczęściej sięgają przepływy pracy związane z tożsamością.

: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

Właściwość Email najpierw sprawdza DN podmiotu pod kątem OID emailAddress. Jeśli nie występuje, stosuje się rozszerzenie Subject Alternative Name (SAN) rfc822Name. Właściwość Country zwraca dwuliterowy kod ISO 3166-1 alpha-2 (na przykład "DE", "US", "FR"). Wszystkie właściwości pomocnicze zwracają null, jeśli odpowiednie pole nie występuje w certyfikacie.

Przeczytaj pełną wersję DN, gdy potrzebujesz wszystkich informacji

W przypadku rejestrowania audytowego, dalszego parsowania lub raportów zgodności, SubjectDN i IssuerDN zwracają pełne ciągi znaków nazwy wyróżniającej.

: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

Jak wyodrębnić dowolne pola dotyczące tematu i nadawcy?

Metody GetSubjectField(string) i GetIssuerField(string) akceptują zarówno skrócone nazwy, jak i numeryczne identyfikatory OID. Nie rozróżniają wielkości liter i zwracają null, jeśli pole nie istnieje.

Obsługiwane skróty: CN, O, OU, C, L, ST, E, SERIALNUMBER, SURNAME, T, GIVENNAME, UID, ORGANIZATIONIDENTIFIER.

Odczytywanie dowolnego pola tematu (w tym identyfikatorów eIDAS OID)

Przekaż krótką nazwę, taką jak "OU", lub numeryczny identyfikator OID, taki jak "2.5.4.97" (identyfikator organizacji eIDAS), aby pobrać dowolne pole z DN podmiotu.

: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

Wyszukiwanie numerycznych identyfikatorów OID ma zasadnicze znaczenie dla certyfikatów eIDAS i certyfikatów stosowanych w branżach podlegających regulacjom, które zawierają identyfikatory organizacji, kwalifikacje zawodowe lub pola specyficzne dla danej jurysdykcji, nieobjęte standardowymi skrótami.

Odczytywanie pól emitenta

GetIssuerField działa w ten sam sposób w odniesieniu do nazwy wyróżniającej (Distinguished Name) certyfikującego urzędu certyfikacji (CA). Jest to przydatne do weryfikacji zaufania, raportowania CA oraz grupowania podpisów według organu, który je wydał.

: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

Jak sprawdzić ważność certyfikatu?

SignerCertificateInfo udostępnia dwa pomocniki sprawdzające poprawność:

  • IsExpired zwraca true, jeśli DateTime.UtcNow > NotAfter.
  • IsValidAt(DateTime) zwraca true, jeśli podany znacznik czasu mieści się w przedziale NotAfter. Typowym zastosowaniem jest potwierdzenie, że certyfikat był ważny w momencie podpisywania.
: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

PoradyIsExpired zwraca false (a nie true), gdy nie można wyodrębnić dat ważności z certyfikatu. Narzędzie pomocnicze jest celowo konserwatywne; nie zakłada wygaśnięcia tylko dlatego, że brakuje metadanych. W przypadku procesów opartych na modelu zero-trust brak dat ważności należy traktować jako wyraźny przypadek niepowodzenia.

W przypadku ścieżek audytu należy zarejestrować zarówno kontrolę IsExpired (aktualna ważność), jak i kontrolę IsValidAt(signingDate) (ważność w momencie podpisania). Certyfikat, który od tego czasu stracił ważność, mógł być nadal ważny w momencie podpisywania dokumentu; oba punkty danych mają znaczenie dla zgodności z przepisami.

Jak wykorzystać odcisk SHA-256 do przypisywania certyfikatów?

Właściwość Sha256Thumbprint zwraca 64-znakowy ciąg znaków szesnastkowych pisanych wielkimi literami, będący skrótem SHA-256 certyfikatu zakodowanego w formacie DER. Jest to wartość, którą porównujesz z listą sprawdzonych certyfikatów podpisujących.

: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

Jak skonstruować certyfikat X509Certificate2 na podstawie surowych danych certyfikatu?

Właściwość RawData zwraca certyfikat zakodowany w formacie DER jako byte[]. Każde wywołanie zwraca kopię ochronną, więc dane wewnętrzne nigdy nie są ujawniane przez odwołanie. Można to wykorzystać do skonstruowania System.Security.Cryptography.X509Certificates.X509Certificate2 w celu współpracy z natywnymi interfejsami API kryptograficznymi .NET (tworzenie łańcuchów, walidacja zasad, sprawdzanie list CRL).

: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

Zwróć uwagęKażde wywołanie RawData zwraca nową kopię ochronną. Wewnętrzna tablica bajtów nigdy nie jest udostępniana przez odwołanie, więc zmiana zwracanych bajtów nie wpłynie na późniejsze wywołania.

Ta ścieżka interoperacyjności pozwala na włączenie weryfikacji podpisów IronPDF do istniejących procesów walidacji certyfikatów .NET, takich jak X509Chain.Build(), sprawdzanie unieważnień za pomocą CRL/OCSP lub niestandardowe implementacje X509CertificateValidator.

Jak przebiega łańcuch certyfikatów?

Właściwość CertificateChain w VerifiedSignature zwraca IReadOnlyList<SignerCertificateInfo> uporządkowany od podpisującego → pośrednich certyfikatów CA → głównego certyfikatu CA. Indeks 0 to zawsze certyfikat podpisującego (ten sam obiekt co SignerCertificate). Lista nigdy nie jest pusta; jeśli łańcucha nie da się wyodrębnić, zawiera on tylko certyfikat podpisującego.

: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

Zwróć uwagęKażdy element SignerCertificateInfo w łańcuchu udostępnia te same właściwości co SignerCertificate: pola tożsamości, ważność, odcisk palca, RawData, GetSubjectField() oraz GetIssuerField(). Można zweryfikować datę wygaśnięcia każdego pośredniego certyfikatu CA, sprawdzić odcisk palca certyfikatu głównego w stosunku do zaufanego magazynu certyfikatów głównych oraz zarejestrować pełny łańcuch certyfikatów na potrzeby audytów zgodności.

Kolejne kroki

SignerCertificate i CertificateChain zapewniają pełną kontrolę X.509 bez opuszczania interfejsu API IronPDF. Kolejnym naturalnym krokiem jest zagłębienie się w te części IronPDF, z którymi te właściwości się łączą.

Jeśli chodzi o stronę podpisującą w procesie, instrukcja dotycząca podpisów cyfrowych obejmuje tworzenie certyfikatów, metadane oraz podpisywanie przyrostowe. W przypadku podpisywania opartego na HSM w środowiskach o wysokim poziomie bezpieczeństwa, przewodnik po podpisywaniu HSM obejmuje integrację z PKCS#11. Potrzebujesz gotowych do użycia fragmentów kodu? Przykład kodu podpisu cyfrowego je przedstawia.

Chcesz wypróbować to na swoich podpisanych plikach PDF? Rozpocznij bezpłatny 30-dniowy okres probny lub zapoznaj się z opcjami licencyjnymi.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 18,918,602 | Wersja: 2026.5 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronPdf
Uruchom przykład i zobacz, jak Twój kod HTML zamienia się w plik PDF.