IRONSOFTWAREHOME

如何從已驗證的PDF簽名中讀取簽名者的證書在C#中 (X.509, eIDAS, Chain)

Curtis Chau
Curtis Chau
Updated: 2026年5月15日

一份合同進入您的審核流程。它是數位簽名的,簽名是有效的,您的合規團隊需要答案:誰簽署了它,他們的證書在那天早上是否有效,發布證書的CA是否符合您信任的列表?您可以提取原始簽名的位元組,解析DER,並手動遍歷證書鏈。 或者你可以詢問SignerCertificate並以屬性的形式讀取答案。

這就是CertificateChain屬性的用途。 從PdfDocument.GetVerifiedSignatures()返回,它們揭露了簽名者的完整X.509身份、發布CA、有效日期、SHA-256指紋、原始DER位元組,以及所有中間證書直到根證書。 這是您用於eIDAS合規性、證書釘扎、審核記錄和信任鏈驗證的API介面。

本指南介紹三種證書檢查型別:

  • **標準X.509詳情:**身份屬性、完整的識別名、有効時間區間及X509Certificate2互操作的原始DER位元組。
  • **eIDAS和受監管行業的字段:**從2.5.4.97以獲取eIDAS的organizationIdentifier。
  • **信任鏈驗證:**SHA-256指紋釘扎和從簽名者到根CA的完整鏈路遍歷。

開始免費30天試用以測試在您的驗證流程中的證書檢查。

NuGetInstall with NuGet

PM > Install-Package IronPdf

Install IronPDF by running the command above in the NuGet Package Manager Console, or search for the package in the NuGet Package Manager.
快速入門:從簽名的PDF中讀取簽名者的證書

在載入的PDF上調用GetVerifiedSignatures並直接從結果中讀取簽名者的證書屬性。

  1. 1Install IronPDF with NuGet Package Manager

    PM > Install-Package IronPdf

  2. 2Copy and run this code snippet.

    var sig = PdfDocument.FromFile("signed.pdf").GetVerifiedSignatures().First();
    var cert = sig.SignerCertificate;
    Console.WriteLine($"{cert?.CommonName} ({cert?.Organization}) valid until {cert?.NotAfter}");
    C#
  3. 3Deploy to test on your live environment

    Start using IronPDF in your project today with a free trial
    arrow pointer

如何提取簽名者的國家ID或個人ID?

SubjectSerialNumber屬性從證書的主體識別名中返回SERIALNUMBER OID的值。 在受監管行業(eIDAS合格證書、銀行業、政府發行的數位ID),此字段承載簽名者的國家ID、稅號或個人身份號。 它不是證書本身的序列號; 這是CertificateSerialNumber

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}");
}
Tips: 快速回顧這兩者之間的區別:SubjectSerialNumber告訴你簽署了文件(人或組織ID,例如嵌入在主體識別名中的國家ID或稅號)。 CertificateSerialNumber告訴你使用了哪份證書; 它是由發布證書的授權機構分配的唯一序列,用於撤銷列表和審核日誌。

如何存取便利的身份屬性?

SignerCertificateInfo將最常需要的主體識別名字段暴露為直接屬性,因此您無需自己解析完整的識別名字串。

讀取簽名者的姓名和附屬關係

Email屬性涵蓋了大多數身份工作流程首選的內容。

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}");
}

emailAddress OID。 如果不存在,它回退到主體替代名稱(SAN)rfc822Name擴展名。 Country屬性返回兩個字母的ISO 3166-1 alpha-2程式碼(例如,"DE"、"US"、"FR")。 如果證書中沒有相應的字段,所有便利屬性均返回null

當您需要完整內容時讀取完整識別名

對於審核日誌、下游解析或合規報告,IssuerDN返回完整的識別名字串。

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}");
}

如何提取任意的主體和發布者字段?

GetIssuerField(string)方法可以接受簡短名稱或數字OID。 它們是不區分大小寫的,如果字段不存在,返回null

支持的簡短名稱:ORGANIZATIONIDENTIFIER

讀取任何主體字段(包括eIDAS的OID)

傳遞像"2.5.4.97"(eIDAS的organizationIdentifier)以從主體識別名中提取任何字段。

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"}");
}

數字OID查找對於嵌入組織標識符、專業資格或不在標準簡短名稱覆蓋範圍內的受司法管轄的字段的eIDAS和受監管行業證書至關重要。

讀取發行者的字段

GetIssuerField在發布CA的識別名上以相同方式工作。 這對於信任驗證、CA報告以及按發佈授權組織分組簽名很有用。

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})");
}

我最喜歡的程式庫是IronPDF。它允許快速高效地操作PDF文件。它還有許多有價值的功能,例如導出到PDF/A格式和數位簽署PDF文件。

Milan Jovanovic

Microsoft MVP

查看案例研究

IronOCR意味著我們每年可以從手動處理中節省$40,000,同時提高生產力,釋放資源以進行高影響的任務。我會強烈推薦它。

Brent Matzelle

首席技術官,OPYN

查看案例研究

IronSuite在我們的運營中扮演著至關重要的角色。這些工具增加了包括建立平面圖和改善庫存管理在內的業務效率。

David Jones

首席軟體工程師,Agorus Build

查看案例研究

如何檢查證書有效性?

SignerCertificateInfo提供兩個有效性幫助工具:

  • DateTime.UtcNow > NotAfter
  • NotAfter窗口中。 典型的用途是確認證書在簽名時有效。
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
    bool validAtSigning = cert.IsValidAt(sig.SigningDate);
    Console.WriteLine($"Valid at signing time ({sig.SigningDate}): {validAtSigning}");
}
Tips: 當無法從證書中提取有效性日期時,true)。 幫助工具故意保守;它不假設只是因為缺少元資料就過期。 對於零信任工作流程,對待缺少有效性日期作為故障案例來顯式處理。

對於審核日誌,記錄IsValidAt(signingDate)檢查(簽名時的有效性)。 自此過期的證書在文件簽署時可能仍然有效; 這兩個資料點對於合規都很重要。

如何使用SHA-256指紋進行證書釘扎?

Sha256Thumbprint屬性返回一個64個字元的全大寫十六進制字串,是DER編碼證書的SHA-256哈希值。 這是您釘在已知良好接受的簽名者證書清單上的值。

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}");
}

如何從原始證書資料構建X509Certificate2?

byte[]。 每次調用返回一個防禦性副本,因此內部資料決不通過引用暴露。 您可以使用此構建一個System.Security.Cryptography.X509Certificates.X509Certificate2以便與.NET的本地密碼API進行互操作(鏈構建、政策驗證、CRL檢查)。

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");
}
Please note: RawData的每次存取都返回一個新的防禦性副本。 內部字節陣列從不通過引用暴露,因此修改返回的字節不會影響以後的調用。

此互操作路徑讓您能夠將IronPDF的簽名驗證插入到現有的.NET證書驗證流水線中,如X509CertificateValidator實現。

如何遍歷證書鏈?

IReadOnlyList<SignerCertificateInfo>,按順序從簽名者→中間CA(s)→根CA排列。 索引0始終是簽名者證書(與SignerCertificate相同的物件)。 列表永遠不為空; 如果無法提取鏈,則僅包含簽名者證書。

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}");
    }
}
Please note: 鏈中的每個GetIssuerField()。 您可以驗證每個中間CA的過期,對照您的受信根儲存檢查根的指紋,並記錄完整鏈以進行合規審核。

下一步

CertificateChain讓您在不離開IronPDF API介面的情況下進行完整的X.509檢查。 從這裡,自然的下一步是更深入地進入這些屬性插入的IronPDF的各個部分。

對於工作流程的簽名部分,數位簽名使用指南涵蓋證書建立、元資料和增量簽名。 對於高安全性環境中的HSM簽名,HSM簽名指南涵蓋PKCS#11整合。 需要準備好的運行片段嗎? 數位簽名程式碼範例提供了這些片段。

準備好自己在已簽名的PDF上進行嘗試了嗎? 開始您的免費30天試用查看授權選項

Frequently Asked Questions

從PDF簽章讀取X.509證書詳細資料的目的是什麼?

從PDF簽章讀取X.509證書詳細資料允許您驗證簽名者的身份、檢查證書的有效性,以及確保符合eIDAS等標準。此過程對於維持文件的真實性和完整性至關重要。

IronPDF如何幫助從PDF簽章中提取簽名者身份?

IronPDF提供工具來提取PDF簽章中的簽名者身份,通過存取X.509證書詳細資料,使得認證文件的來源和驗證簽名者的證書更容易。

IronPDF能否從PDF簽章中提取eIDAS欄位?

是的,IronPDF可以從PDF簽章中提取eIDAS欄位,讓開發者確保文件符合歐盟關於電子簽章的規定。

使用IronPDF可以從PDF簽章中檢索到哪些資訊?

使用IronPDF,您可以從PDF簽章中檢索到簽名者身份、證書有效性、雜湊值及證書鏈等資訊,提供簽章真實性的一個全面觀點。

是否可以使用IronPDF驗證PDF簽章的有效性?

是的,IronPDF允許您通過檢查X.509證書詳細資料驗證PDF簽章的有效性,這可以包含檢查過期日期和簽署證書的完整性。

使用IronPDF進行PDF簽章驗證有哪些優勢?

使用IronPDF進行PDF簽章驗證提供的優勢包括自動提取詳細的證書資訊、與C#應用程式的相容性,以及遵循國際標準如eIDAS。

IronPDF如何處理從PDF簽章中提取雜湊值?

IronPDF通過存取PDF簽章中的X.509證書詳細資料來處理雜湊值提取,使您可以通過其獨特的指紋驗證證書的真實性和完整性。

IronPDF能否提供PDF簽章的證書鏈?

IronPDF能夠提供PDF簽章的證書鏈,幫助您追蹤從簽名者證書到信任根證書的信任路徑,從而確保簽章的有效性。

IronPDF支持哪種程式語言用來讀取PDF簽章?

IronPDF支持C#來讀取和驗證PDF簽章,使其成為.NET生態系統內開發者的理想解決方案。

IronPDF是否符合電子簽章的國際標準?

是的,IronPDF符合國際標準如eIDAS,確保您的PDF簽章驗證過程符合電子簽章的法規要求。

Curtis Chau
Technical Writer

Curtis Chau holds a Bachelor’s degree in Computer Science (Carleton University) and specializes in front-end development with expertise in Node.js, TypeScript, JavaScript, and React. Passionate about crafting intuitive and aesthetically pleasing user interfaces, Curtis enjoys working with modern frameworks and creating well-structured, visually appealing manuals.

...
Read More

準備開始了嗎?

Nuget Downloads 20,389,208版本:2026.7剛剛發布

立即獲取您的免費30天試用密鑰
不需要信用卡或建立賬戶

免費試用IronPDF

5分鐘內設定完成

C# PDF DLL

下載DLL

立即下載

或者點擊此處下載Windows安裝程式。

  1. 下載並解壓IronPDF到類似~/Libs的位置,位於您的解決方案目錄中
  2. 在Visual Studio解決方案資源管理器,右鍵點選參考。選擇瀏覽,"IronPdf.dll"
C# 用於PDF的NuGet程式庫

使用NuGet安裝

                  Install-Package IronPdf
                
nuget.org/packages/IronPdf/
  1. 在解決方案資源管理器,右鍵點選參考,管理NuGet包
  2. 選擇瀏覽並搜尋"IronPdf"
  3. 選擇套件並安裝

授權從$999

有問題嗎?聯絡我們的開發團隊。

Key in blue circle

立即免費取得 30 天試用金鑰

bullet_checked無需信用卡或建立帳號
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
預訂您的免費現場演示
Booking Badge related to IronPDF Product Demo

受到全球數百萬工程師的信任

Iron Software的客戶標誌
獲取您的無義務諮詢
填寫以下表格或電子郵件sales@ironsoftware.com
您的詳細資訊將始終保密
受到全球數百萬工程師的信任
Iron Software的客戶標誌
立即獲取您的30天試用金鑰
無需信用卡或帳戶建立