# C#'da Doğrulanmış PDF İmzalarından İmzalayanın Sertifikasını Okuma (X.509, eIDAS, Zincir)
Denetim boru hattınıza bir sözleşme gelir. Sözleşme dijital olarak imzalanmıştır, imza geçerlidir ve uyum ekibinizin bazı sorularına yanıt bulması gerekir: Sözleşmeyi kim imzalamıştır, o sabah sertifikası geçerli miydi ve sertifikayı veren CA, güvenilir listesiyle eşleşiyor mu? Ham imza baytlarını çekebilir, DER'yi ayrıştırabilir ve sertifika zincirini elle inceleyebilirsiniz. Veya cevapları özellikler olarak okuyarak `VerifiedSignature` nesnesine `SignerCertificate` sormayı deneyebilirsiniz.
Bu, [`VerifiedSignature`](https://ironpdf.com/object-reference/api/IronPdf.Signing.Inspection.VerifiedSignature.html) üzerindeki `SignerCertificate` ve `CertificateChain` özelliklerinin neden inşa edildiğidir. [`PdfDocument.GetVerifiedSignatures()`](https://ironpdf.com/how-to/signing/)'den döndürülen, imzalayanın X.509 kimliği, veren CA, geçerlilik tarihleri, SHA-256 parmak izi, ham DER baytları ve köke kadar her ara sertifikayı gösterir. Bu, eIDAS uyumluluğu, sertifika sabitleme, denetim izleri ve güven zinciri doğrulaması için ihtiyacınız olan API yüzeyidir.
Bu kılavuz, üç sertifika denetim grubunu ele almaktadır:
- **Standart X.509 detayları:** kimlik özellikleri, tam Ayırt Edilmiş İsimler, geçerlilik pencereleri ve `X509Certificate2` iletişimi için ham DER baytları.
- **eIDAS ve düzenlenmiş endüstri alanları:** `SubjectSerialNumber` üzerinden imzalayanın ulusal kimlik numarasını çekme ve eIDAS organizationIdentifier için `2.5.4.97` gibi sayısal OID'leri okuma.
- **Güven zinciri doğrulama:** SHA-256 parmak izi sabitleme ve imzalayan kişiden kök CA'ya kadar tüm zinciri izleme.
Doğrulama sürecinizde sertifika denetimini test etmek için [30 günlük ücretsiz deneme sürümünü başlatın](https://ironpdf.com/#trial-license).
!!!--LIBRARY_NUGET_INSTALL_BLOCK--!!!
*as-heading:2(Hızlı Başlangıç: İmzalı bir PDF'den İmzalayanın Sertifikasını Okuma)*
Yüklü bir PDF üzerinde `GetVerifiedSignatures` çağırarak, imzalayanın sertifika özelliklerini doğrudan sonuçtan okuyabilirsiniz.
```cs
:title=Read certificate details in three lines
var sig = PdfDocument.FromFile("signed.pdf").GetVerifiedSignatures().First();
var cert = sig.SignerCertificate;
Console.WriteLine($"{cert?.CommonName} ({cert?.Organization}) valid until {cert?.NotAfter}");
```
<div class="hsg-featured-snippet">
<h3>Minimal İş Akışı (3 adım)</h3>
<ol>
<li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://www.nuget.org/packages/IronPdf/">IronPDF'yu NuGet'ten İndirin</a></li>
<li>İmzalanmış bir PDF dosyasını yükleyin ve <code>GetVerifiedSignatures() işlevini</code> çağırarak doğrulanmış imza nesnelerinin listesini alın</li>
<li>Kimlik ve geçerlilik için <code>sig.SignerCertificate'i</code> okuyun veya tam güven zinciri için <code>sig.CertificateChain'i</code> inceleyin.</li>
</ol>
</div>
<br class="clear" />
## İmzalayanın ulusal veya kişisel kimlik numarasını nasıl çıkarırsınız?
`SubjectSerialNumber` özelliği, sertifikanın Konu DN'sinden SERIALNUMBER OID değerini döndürür. Düzenlemelere tabi sektörlerde (eIDAS onaylı sertifikalar, bankacılık, devlet tarafından verilen dijital kimlikler), bu alan imzalayan kişinin ulusal kimlik numarasını, vergi kimlik numarasını veya kişisel kimlik numarasını içerir. Bu, sertifikanın kendi seri numarası değildir; bu `CertificateSerialNumber`.
```csharp
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}");
}
```
[[t:(Bu ikisi arasındaki farkla ilgili kısa bir hatırlatma: `SubjectSerialNumber` dokümanı *kim* imzaladığını söyler (bir kişi veya organizasyon kimliği, Konu DN içine gömülmüş gibi bir ulusal kimlik veya vergi numarası). `CertificateSerialNumber` *hangi sertifikanın* kullanıldığını söyler; (Bu, sertifika veren Yetkili Kurumun iptal listeleri ve denetim günlükleri için atadığı benzersiz seridir.)]]
## Convenience Identity Özelliklerine Nasıl Erişebilirsiniz?
`SignerCertificateInfo` en yaygın ihtiyaç duyulan Konu DN alanlarını doğrudan özellikler olarak gösterir, bu yüzden tam DN dizisini kendiniz ayrıştırmanıza gerek yoktur.
#### İmzalayanın Adını ve Bağlı Olduğu Kurumu Okuma
`CommonName`, `Organization`, `Country` ve `Email` özellikleri, çoğu kimlik iş akışının öncelikle ulaştığı şeyleri kapsar.
```csharp
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}");
}
```
`Email` özelliği önce `emailAddress` OID'sini Konu DN'sinde kontrol eder. Mevcut değilse, Konu Alternatif Adı (SAN) `rfc822Name` uzantısına geri döner. `Country` özelliği, iki harfli ISO 3166-1 alpha-2 kodunu döndürür (örneğin, "DE", "US", "FR"). Tüm kolaylık özellikleri, sertifikada karşılık gelen alan mevcut değilse `null` döndürür.
#### Her Şeye İhtiyacınız Olduğunda Tam DN'yi Okuma
Denetim günlüğü, veri analizi veya uyumluluk raporları için, `SubjectDN` ve `IssuerDN` tam Ayırt Edilmiş İsim dizelerini döndürür.
```csharp
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}");
}
```
## Rastgele Konu ve Veren Alanlarını Nasıl Çıkarırsınız?
`GetSubjectField(string)` ve `GetIssuerField(string)` yöntemleri, kısa adlar veya sayısal OID'leri kabul eder. Bu yöntemler büyük/küçük harf duyarlı değildir ve alan mevcut değilse `null` döndürür.
Desteklenen kısa adlar: `CN`, `O`, `OU`, `C`, `L`, `ST`, `E`, `SERIALNUMBER`, `SURNAME`, `T`, `GIVENNAME`, `UID`, `ORGANIZATIONIDENTIFIER`.
#### Herhangi Bir Konu Alanını Okuma (eIDAS OID'leri Dahil)
Konu DN'den herhangi bir alanı çekmek için `"OU"` gibi bir kısa ad veya `"2.5.4.97"` (eIDAS organizationIdentifier) gibi bir sayısal OID geçirin.
```csharp
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"}");
}
```
Sayısal OID aramaları, eIDAS ve kuruluş kimliklerini, mesleki nitelikleri veya standart kısa adlarla kapsanmayan yargı alanına özgü alanları ekleyen düzenlenmiş endüstri sertifikaları için esastır.
#### Verenin Alanlarını Okuma
`GetIssuerField`, veren CA'nın Ayırt Edilmiş İsmi üzerinde aynı şekilde çalışır. Bu, güven doğrulama, CA raporlaması ve imzaların verici otoriteye göre gruplandırılması için yararlıdır.
```csharp
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})");
}
```
## Sertifika Geçerliliğini Nasıl Kontrol Edersiniz?
`SignerCertificateInfo` iki geçerlilik yardımcısı sağlar:
- `IsExpired`, `DateTime.UtcNow > NotAfter` ise `true` döndürür.
- `IsValidAt(DateTime)`, verilen zaman damgası `NotAfter` penceresi içinde ise `true` döndürür. Genel kullanım, sertifikanın imzalama sırasında geçerli olduğunu doğrulamaktır.
```csharp
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}");
}
```
[[t:(Geçerlilik tarihleri sertifikadan çıkarılamadığında `IsExpired` `false` (değil `true`) döndürür. Yardımcı kasıtlı olarak temkinlidir; yalnızca meta veriler eksik olduğu için süresinin dolduğunu varsaymaz. Sıfır güven iş akışları için, eksik geçerlilik tarihlerini açıkça bir hata durumu olarak ele alın.)]]
[Denetim izleri](https://ironpdf.com/how-to/revision-history/) için, hem `IsExpired` kontrolünü (geçerli geçerlilik) hem de `IsValidAt(signingDate)` kontrolünü (imzalama anındaki geçerlilik) kaydedin. Sonrasında süresi dolmuş bir sertifika hala belgenin imzalandığı sırada geçerli olabilir; her iki veri noktası da uyumluluk açısından önemlidir.
## Sertifika Sabitleme İçin SHA-256 Parmak İzini Nasıl Kullanırsınız?
`Sha256Thumbprint` özelliği, DER kodlu sertifikanın SHA-256 karması olan 64 karakterli büyük harfli bir hex dizisini döndürür. Bu, kabul edilen imzalayan sertifikaların bilinen iyi listesine karşı sabitlediğiniz değerdir.
```csharp
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}");
}
```
## Ham Sertifika Verilerinden X509Certificate2 Nasıl Oluşturursunuz?
`RawData` özelliği, DER kodlamalı sertifikayı bir `byte[]` olarak döndürür. Her çağrı savunma kopyası döndürür, böylece dahili veriler referans olarak hiçbir zaman açığa çıkmaz. Bu veriyle, .NET'in yerel kriptografik API'leriyle (zincir oluşturma, politika doğrulama, CRL kontrolü) etkileşim için bir `System.Security.Cryptography.X509Certificates.X509Certificate2` oluşturabilirsiniz.
```csharp
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");
}
```
[[i:(Her `RawData` erişimi, taze bir savunma kopyası döndürür. Dahili bayt dizisi, referans olarak hiçbir zaman açığa çıkmaz, böylece döndürülen baytları değiştirmek sonraki çağrıları etkilemez.)]]
Bu etkileşim yolu, IronPDF'nin imza doğrulamasını [`X509Chain.Build()`](https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.x509chain.build) gibi mevcut .NET sertifika doğrulama hatlarına, CRL/OCSP üzerinden iptal kontrolüne veya özel `X509CertificateValidator` uygulamalarına takmanıza olanak tanır.
## Sertifika Zincirini Nasıl Yürürsünüz?
`VerifiedSignature` üzerindeki `CertificateChain` özelliği, imzalayan → ara CA(lar) → kök CA'dan sıralanmış bir `IReadOnlyList<SignerCertificateInfo>` döndürür. İndeks 0 her zaman imzalayan sertifikadır (aynı nesne `SignerCertificate` olarak). Liste asla null değildir; eğer zincir çıkarılamazsa, yalnızca imzalayan sertifikayı içerir.
```csharp
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}");
}
}
```
[[i:(Zincirdeki her `SignerCertificateInfo`, `SignerCertificate` ile aynı özellikleri gösterir: kimlik alanları, geçerlilik, parmak izi, `RawData`, `GetSubjectField()` ve `GetIssuerField()`. Her ara CA'nın süresini doğrulayabilir, kökün parmak izini güvenilir kök depolarınıza karşı kontrol edebilir ve uyumluluk denetimleri için tam zinciri kaydedebilirsiniz.)]]
## Sonraki Adımlar
`SignerCertificate` ve `CertificateChain`, IronPDF API yüzeyinden ayrılmadan tam X.509 incelemesi sağlar. Buradan, bu özelliklerin yerleştirdiği IronPDF'nin parçalarına daha derinlemesine gitmek doğal bir sonraki harekettir.
İş akışının imzalama tarafı için, [dijital imzalar nasıl yapılır](https://ironpdf.com/how-to/signing/) bölümü, sertifika oluşturma, meta veriler ve artımlı imzalama konularını ele alır. Yüksek güvenlikli ortamlarda HSM tabanlı imzalama için, [HSM imzalama kılavuzu](https://ironpdf.com/how-to/signing-pdf-with-hsm/), PKCS#11 entegrasyonunu kapsar. Çalıştırmaya hazır parçacıklara mı ihtiyacınız var? [dijital imzalar kod örneği](https://ironpdf.com/examples/digitally-sign-a-pdf/) onları sağlar.
Kendi imzalanmış PDF'lerinizde denemeye hazır mısınız? [Ücretsiz 30 günlük denemenize başlayın](https://ironpdf.com/#trial-license) veya [lisanslama seçeneklerini görüntüleyin](https://ironpdf.com/licensing/).
Denetim boru hattınıza bir sözleşme gelir. Sözleşme dijital olarak imzalanmıştır, imza geçerlidir ve uyum ekibinizin bazı sorularına yanıt bulması gerekir: Sözleşmeyi kim imzalamıştır, o sabah sertifikası geçerli miydi ve sertifikayı veren CA, güvenilir listesiyle eşleşiyor mu? Ham imza baytlarını çekebilir, DER'yi ayrıştırabilir ve sertifika zincirini elle inceleyebilirsiniz. Veya cevapları özellikler olarak okuyarak VerifiedSignature nesnesine SignerCertificate sormayı deneyebilirsiniz.
Bu, VerifiedSignature üzerindeki SignerCertificate ve CertificateChain özelliklerinin neden inşa edildiğidir. PdfDocument.GetVerifiedSignatures()'den döndürülen, imzalayanın X.509 kimliği, veren CA, geçerlilik tarihleri, SHA-256 parmak izi, ham DER baytları ve köke kadar her ara sertifikayı gösterir. Bu, eIDAS uyumluluğu, sertifika sabitleme, denetim izleri ve güven zinciri doğrulaması için ihtiyacınız olan API yüzeyidir.
Bu kılavuz, üç sertifika denetim grubunu ele almaktadır:
Standart X.509 detayları: kimlik özellikleri, tam Ayırt Edilmiş İsimler, geçerlilik pencereleri ve X509Certificate2 iletişimi için ham DER baytları.
eIDAS ve düzenlenmiş endüstri alanları:SubjectSerialNumber üzerinden imzalayanın ulusal kimlik numarasını çekme ve eIDAS organizationIdentifier için 2.5.4.97 gibi sayısal OID'leri okuma.
Güven zinciri doğrulama: SHA-256 parmak izi sabitleme ve imzalayan kişiden kök CA'ya kadar tüm zinciri izleme.
Install IronPDF by running the command above in the NuGet Package Manager Console, or search for the package in the NuGet Package Manager.
Hızlı Başlangıç: İmzalı bir PDF'den İmzalayanın Sertifikasını Okuma
Yüklü bir PDF üzerinde GetVerifiedSignatures çağırarak, imzalayanın sertifika özelliklerini doğrudan sonuçtan okuyabilirsiniz.
1Install IronPDF with NuGet Package Manager
PM > Install-Package IronPdf
Install-Package IronPdf
2Bu kod parçacığını kopyalayın ve çalıştırın.
var sig = PdfDocument.FromFile("signed.pdf").GetVerifiedSignatures().First();var cert = sig.SignerCertificate;Console.WriteLine($"{cert?.CommonName} ({cert?.Organization}) valid until {cert?.NotAfter}");
var sig = PdfDocument.FromFile("signed.pdf").GetVerifiedSignatures().First();
var cert = sig.SignerCertificate;
Console.WriteLine($"{cert?.CommonName} ({cert?.Organization}) valid until {cert?.NotAfter}");
C#
3Canlı ortamınızda test için dağıtım yapın
Ücretsiz deneme ile bugün projenizde IronPDF kullanmaya başlayın
İmzalanmış bir PDF dosyasını yükleyin ve GetVerifiedSignatures() işlevini çağırarak doğrulanmış imza nesnelerinin listesini alın
Kimlik ve geçerlilik için sig.SignerCertificate'i okuyun veya tam güven zinciri için sig.CertificateChain'i inceleyin.
İmzalayanın ulusal veya kişisel kimlik numarasını nasıl çıkarırsınız?
SubjectSerialNumber özelliği, sertifikanın Konu DN'sinden SERIALNUMBER OID değerini döndürür. Düzenlemelere tabi sektörlerde (eIDAS onaylı sertifikalar, bankacılık, devlet tarafından verilen dijital kimlikler), bu alan imzalayan kişinin ulusal kimlik numarasını, vergi kimlik numarasını veya kişisel kimlik numarasını içerir. Bu, sertifikanın kendi seri numarası değildir; bu 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 CAConsole.WriteLine($"Certificate Serial (CA-issued): {cert.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}");
}
ImportsIronPdfImportsIronPdf.Signing.InspectionDim 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 CAConsole.WriteLine($"Certificate Serial (CA-issued): {cert.CertificateSerialNumber}")Next
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
İpuçları: Bu ikisi arasındaki farkla ilgili kısa bir hatırlatma: SubjectSerialNumber dokümanı kim imzaladığını söyler (bir kişi veya organizasyon kimliği, Konu DN içine gömülmüş gibi bir ulusal kimlik veya vergi numarası). CertificateSerialNumberhangi sertifikanın kullanıldığını söyler; (Bu, sertifika veren Yetkili Kurumun iptal listeleri ve denetim günlükleri için atadığı benzersiz seridir.
Convenience Identity Özelliklerine Nasıl Erişebilirsiniz?
SignerCertificateInfo en yaygın ihtiyaç duyulan Konu DN alanlarını doğrudan özellikler olarak gösterir, bu yüzden tam DN dizisini kendiniz ayrıştırmanıza gerek yoktur.
İmzalayanın Adını ve Bağlı Olduğu Kurumu Okuma
CommonName, Organization, Country ve Email özellikleri, çoğu kimlik iş akışının öncelikle ulaştığı şeyleri kapsar.
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 propertiesConsole.WriteLine($"CommonName (CN): {cert.CommonName}");Console.WriteLine($"Organization (O): {cert.Organization}");Console.WriteLine($"Country (C): {cert.Country}");Console.WriteLine($"Email: {cert.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}");
}
ImportsIronPdfImportsIronPdf.Signing.InspectionDim 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 propertiesConsole.WriteLine($"CommonName (CN): {cert.CommonName}")Console.WriteLine($"Organization (O): {cert.Organization}")Console.WriteLine($"Country (C): {cert.Country}")Console.WriteLine($"Email: {cert.Email}")Next
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
Email özelliği önce emailAddress OID'sini Konu DN'sinde kontrol eder. Mevcut değilse, Konu Alternatif Adı (SAN) rfc822Name uzantısına geri döner. Country özelliği, iki harfli ISO 3166-1 alpha-2 kodunu döndürür (örneğin, "DE", "US", "FR"). Tüm kolaylık özellikleri, sertifikada karşılık gelen alan mevcut değilse null döndürür.
Her Şeye İhtiyacınız Olduğunda Tam DN'yi Okuma
Denetim günlüğü, veri analizi veya uyumluluk raporları için, SubjectDN ve IssuerDN tam Ayırt Edilmiş İsim dizelerini döndürür.
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 parsingConsole.WriteLine($"Full Subject DN: {cert.SubjectDN}");Console.WriteLine($"Full Issuer DN: {cert.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}");
}
ImportsIronPdfImportsIronPdf.Signing.InspectionDim 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 parsingConsole.WriteLine($"Full Subject DN: {cert.SubjectDN}")Console.WriteLine($"Full Issuer DN: {cert.IssuerDN}")Next
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
Rastgele Konu ve Veren Alanlarını Nasıl Çıkarırsınız?
GetSubjectField(string) ve GetIssuerField(string) yöntemleri, kısa adlar veya sayısal OID'leri kabul eder. Bu yöntemler büyük/küçük harf duyarlı değildir ve alan mevcut değilse null döndürür.
Desteklenen kısa adlar: CN, O, OU, C, L, ST, E, SERIALNUMBER, SURNAME, T, GIVENNAME, UID, ORGANIZATIONIDENTIFIER.
Herhangi Bir Konu Alanını Okuma (eIDAS OID'leri Dahil)
Konu DN'den herhangi bir alanı çekmek için "OU" gibi bir kısa ad veya "2.5.4.97" (eIDAS organizationIdentifier) gibi bir sayısal OID geçirin.
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"}");}
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"}");
}
ImportsIronPdfImportsIronPdf.Signing.InspectionDim 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 AsString = cert.GetSubjectField("OU") Dim surname AsString = cert.GetSubjectField("SURNAME") Dim givenName AsString = cert.GetSubjectField("GIVENNAME") Dim title AsString = cert.GetSubjectField("T") ' Numeric OID lookup (eIDAS organizationIdentifier) Dim orgId AsString = 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
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
Sayısal OID aramaları, eIDAS ve kuruluş kimliklerini, mesleki nitelikleri veya standart kısa adlarla kapsanmayan yargı alanına özgü alanları ekleyen düzenlenmiş endüstri sertifikaları için esastır.
Verenin Alanlarını Okuma
GetIssuerField, veren CA'nın Ayırt Edilmiş İsmi üzerinde aynı şekilde çalışır. Bu, güven doğrulama, CA raporlaması ve imzaların verici otoriteye göre gruplandırılması için yararlıdır.
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})");}
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})");
}
ImportsIronPdfImportsIronPdf.Signing.InspectionDim 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 AsString = cert.GetIssuerField("CN") Dim issuerO AsString = cert.GetIssuerField("O") Dim issuerCountry AsString = cert.GetIssuerField("C")Console.WriteLine($"Issued by: {issuerCN} ({issuerO}, {issuerCountry})")Next
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
Bu türden favori kütüphanem IronPDF'dir. PDF dosyalarının hızlı ve verimli bir şekilde işlenmesine olanak tanır. Ayrıca, PDF/A formatına dışa aktarma ve dijital imzalama gibi birçok değerli özelliğe sahiptir.
IronOCR, manuel işleme maliyetinden yıllık 40.000 USD tasarruf etmemizi sağlıyor, üretkenliği artırıyor ve yüksek etkili görevler için kaynakları serbest bırakıyor. Kesinlikle tavsiye ederim.
SignerCertificateInfo iki geçerlilik yardımcısı sağlar:
IsExpired, DateTime.UtcNow > NotAfter ise true döndürür.
IsValidAt(DateTime), verilen zaman damgası NotAfter penceresi içinde ise true döndürür. Genel kullanım, sertifikanın imzalama sırasında geçerli olduğunu doğrulamaktır.
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}");}
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}");
}
ImportsIronPdfImportsIronPdf.Signing.InspectionDim pdf = PdfDocument.FromFile("archived-contract.pdf")For Each sig In pdf.GetVerifiedSignatures() Dim cert = sig.SignerCertificate If cert Is Nothing Then Continue ForConsole.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 Dim validAtSigning AsBoolean = cert.IsValidAt(sig.SigningDate)Console.WriteLine($"Valid at signing time ({sig.SigningDate}): {validAtSigning}")Next
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
Dim validAtSigning As Boolean = cert.IsValidAt(sig.SigningDate)
Console.WriteLine($"Valid at signing time ({sig.SigningDate}): {validAtSigning}")
Next
İpuçları: Geçerlilik tarihleri sertifikadan çıkarılamadığında IsExpiredfalse (değil true) döndürür. Yardımcı kasıtlı olarak temkinlidir; yalnızca meta veriler eksik olduğu için süresinin dolduğunu varsaymaz. Sıfır güven iş akışları için, eksik geçerlilik tarihlerini açıkça bir hata durumu olarak ele alın.
Denetim izleri için, hem IsExpired kontrolünü (geçerli geçerlilik) hem de IsValidAt(signingDate) kontrolünü (imzalama anındaki geçerlilik) kaydedin. Sonrasında süresi dolmuş bir sertifika hala belgenin imzalandığı sırada geçerli olabilir; her iki veri noktası da uyumluluk açısından önemlidir.
Sertifika Sabitleme İçin SHA-256 Parmak İzini Nasıl Kullanırsınız?
Sha256Thumbprint özelliği, DER kodlu sertifikanın SHA-256 karması olan 64 karakterli büyük harfli bir hex dizisini döndürür. Bu, kabul edilen imzalayan sertifikaların bilinen iyi listesine karşı sabitlediğiniz değerdir.
using IronPdf;using IronPdf.Signing.Inspection;using System.Collections.Generic;// Known-good signer thumbprints from a compliance databasevar 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}");}
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}");
}
ImportsIronPdfImportsIronPdf.Signing.InspectionImportsSystem.Collections.Generic' Known-good signer thumbprints from a compliance databaseDim pinnedThumbprints As New HashSet(OfString) 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 AsBoolean = pinnedThumbprints.Contains(cert.Sha256Thumbprint)Console.WriteLine($"Signer: {cert.CommonName}, Thumbprint: {cert.Sha256Thumbprint}")Console.WriteLine($"Pinned: {trusted}")Next
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
Ham Sertifika Verilerinden X509Certificate2 Nasıl Oluşturursunuz?
RawData özelliği, DER kodlamalı sertifikayı bir byte[] olarak döndürür. Her çağrı savunma kopyası döndürür, böylece dahili veriler referans olarak hiçbir zaman açığa çıkmaz. Bu veriyle, .NET'in yerel kriptografik API'leriyle (zincir oluşturma, politika doğrulama, CRL kontrolü) etkileşim için bir System.Security.Cryptography.X509Certificates.X509Certificate2 oluşturabilirsiniz.
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");}
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");
}
ImportsIronPdfImportsIronPdf.Signing.InspectionImportsSystem.Security.Cryptography.X509CertificatesDim 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 AsByte() = 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
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
Lütfen dikkate alın: Her RawData erişimi, taze bir savunma kopyası döndürür. Dahili bayt dizisi, referans olarak hiçbir zaman açığa çıkmaz, böylece döndürülen baytları değiştirmek sonraki çağrıları etkilemez.
Bu etkileşim yolu, IronPDF'nin imza doğrulamasını X509Chain.Build() gibi mevcut .NET sertifika doğrulama hatlarına, CRL/OCSP üzerinden iptal kontrolüne veya özel X509CertificateValidator uygulamalarına takmanıza olanak tanır.
Sertifika Zincirini Nasıl Yürürsünüz?
VerifiedSignature üzerindeki CertificateChain özelliği, imzalayan → ara CA(lar) → kök CA'dan sıralanmış bir IReadOnlyList<SignerCertificateInfo> döndürür. İndeks 0 her zaman imzalayan sertifikadır (aynı nesne SignerCertificate olarak). Liste asla null değildir; eğer zincir çıkarılamazsa, yalnızca imzalayan sertifikayı içerir.
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}"); }}
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}");
}
}
ImportsIronPdfImportsIronPdf.Signing.InspectionDim 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 AsInteger = 0 To sig.CertificateChain.Count - 1 Dim cert = sig.CertificateChain(i) Dim role AsString = 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}") NextNext
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
Lütfen dikkate alın: Zincirdeki her SignerCertificateInfo, SignerCertificate ile aynı özellikleri gösterir: kimlik alanları, geçerlilik, parmak izi, RawData, GetSubjectField() ve GetIssuerField(). Her ara CA'nın süresini doğrulayabilir, kökün parmak izini güvenilir kök depolarınıza karşı kontrol edebilir ve uyumluluk denetimleri için tam zinciri kaydedebilirsiniz.
Sonraki Adımlar
SignerCertificate ve CertificateChain, IronPDF API yüzeyinden ayrılmadan tam X.509 incelemesi sağlar. Buradan, bu özelliklerin yerleştirdiği IronPDF'nin parçalarına daha derinlemesine gitmek doğal bir sonraki harekettir.
İş akışının imzalama tarafı için, dijital imzalar nasıl yapılır bölümü, sertifika oluşturma, meta veriler ve artımlı imzalama konularını ele alır. Yüksek güvenlikli ortamlarda HSM tabanlı imzalama için, HSM imzalama kılavuzu, PKCS#11 entegrasyonunu kapsar. Çalıştırmaya hazır parçacıklara mı ihtiyacınız var? dijital imzalar kod örneği onları sağlar.
PDF imzalarından X.509 sertifika detaylarını okumanın amacı nedir?
PDF imzalarından X.509 sertifika detaylarını okumak, imzalayanın kimliğini doğrulamanızı, sertifikanın geçerliliğini kontrol etmenizi ve eIDAS gibi standartlara uyumluluğu sağlamanızı mümkün kılar. Bu işlem, belgelerin doğruluğunu ve bütünlüğünü korumak için gereklidir.
IronPDF, PDF imzalarından imzalayan kimliğini nasıl çıkartır?
IronPDF, PDF imzalarından imzalayan kimliğini X.509 sertifika detaylarına erişerek çıkartan araçlar sunar, bu da belgenin kaynağını doğrulamayı ve imzalayanın kimlik bilgilerini önemsimayi kolaylaştırır.
IronPDF, PDF imzalarından eIDAS alanları çıkartabilir mi?
Evet, IronPDF PDF imzalarından eIDAS alanlarını çıkartabilir, bu da geliştiricilerin belgelerin Avrupa Birliği'nin elektronik imza ile ilgili düzenlemelerine uyumluluğunu sağlamasını mümkün kılar.
IronPDF kullanarak PDF imzasından hangi bilgiler elde edilebilir?
IronPDF kullanarak, PDF imzasından imzalayan kimliği, sertifika geçerliliği, parmak izi ve sertifika zinciri gibi bilgileri alabilir, imzanın doğruluğunu ayrıntılı şekilde anlayabilirsiniz.
IronPDF kullanarak bir PDF imzasının geçerliliğini doğrulamak mümkün mü?
Evet, IronPDF, X.509 sertifika detaylarını inceleyerek PDF imzasının geçerliliğini doğrulamanıza olanak tanır; buna, son kullanma tarihlerini kontrol etmek ve imzalama sertifikasının bütünlüğünü sağlamak dahildir.
PDF imza doğrulaması için IronPDF kullanmanın faydaları nelerdir?
IronPDF kullanarak PDF imza doğrulaması yapmak, ayrıntılı sertifika bilgilerinin otomatik olarak çıkarılması, C# uygulamaları ile uyumluluk ve eIDAS gibi uluslararası standartlara uyum gibi faydalar sağlar.
IronPDF, PDF imzalarından parmak izi çıkarmayı nasıl yönetir?
IronPDF, X.509 sertifika detaylarına PDF imzası içinde erişerek parmak izi çıkarmayı yönetir, böylece siz de sertifikanın benzersiz parmak izi ile doğruluğunu ve bütünlüğünü doğrulayabilirsiniz.
IronPDF, PDF imzasından bir sertifika zinciri sağlayabilir mi?
IronPDF, PDF imzasından bir sertifika zinciri sağlayabilir; bu, imzalayanın sertifikasından güvenilen kök sertifikasına kadar olan güven yolunu izlemenize yardımcı olur, imzanın geçerliliğini sağlar.
IronPDF, PDF imzalarını okumak için hangi programlama dilini destekler?
IronPDF, PDF imzalarını okumak ve doğrulamak için C#'ı destekler, bu da .NET ekosisteminde çalışan geliştiriciler için ideal bir çözüm sunar.
IronPDF, elektronik imzalar için uluslararası standartlarla uyumlu mu?
Evet, IronPDF, eIDAS gibi uluslararası standartlarla uyumludur, böylece PDF imza doğrulama süreçlerinizin elektronik imzalarla ilgili düzenleyici gereksinimleri karşıladığından emin olabilirsiniz.
Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.