C#에서 Verified PDF 서명의 서명자 인증서를 읽는 방법 (X.509, eIDAS, 체인)
감사 파이프라인에 계약서가 도착했습니다. 이 계약서는 디지털 서명이 되어 있으며 서명은 유효합니다. 이제 규정 준수 팀은 누가 서명했는지, 그날 아침 해당 인증서가 유효했는지, 발급 CA가 신뢰 목록과 일치하는지 확인해야 합니다. 원시 서명 바이트를 추출하고, DER을 파싱하며, 인증서 체인을 수동으로 추적할 수도 있습니다. 또는 VerifiedSignature 객체에 SignerCertificate를 요청하여 응답을 속성으로 읽어올 수 있습니다.
이것이 바로 VerifiedSignature의 SignerCertificate 및 CertificateChain 속성이 구현된 목적입니다. PdfDocument.GetVerifiedSignatures()에서 반환된 이 정보에는 서명자의 전체 X.509 신원, 발급 CA, 유효 기간, SHA-256 썸프린트, 원시 DER 바이트, 그리고 루트 인증서까지의 모든 중간 인증서가 포함됩니다. 이것이 바로 eIDAS 규정 준수, 인증서 고정, 감사 추적 및 신뢰 체인 검증을 위해 필요한 API 인터페이스입니다.
이 가이드에서는 세 가지 유형의 인증서 검사를 단계별로 설명합니다:
- 표준 X.509 세부 정보: 신원 속성, 전체 식별명(Distinguished Name), 유효 기간,
X509Certificate2상호 운용성을 위한 원시 DER 바이트. - eIDAS 및 규제 산업 분야:
SubjectSerialNumber에서 서명자의 주민등록번호를 추출하고, eIDAS organizationIdentifier의 경우2.5.4.97와 같은 숫자형 OID를 읽습니다. - 트러스트 체인 검증: SHA-256 썸프린트 고정 및 서명자에서 루트 CA까지 전체 체인을 추적하는 과정.
30일 무료 체험을 시작하여 검증 파이프라인에서 인증서 검사를 테스트해 보세요.
빠른 시작: 서명된 PDF에서 서명자 인증서 읽기
로드된 PDF에서 GetVerifiedSignatures을 호출하고, 결과에서 서명자의 인증서 속성을 직접 읽어옵니다.
-
NuGet 패키지 관리자를 사용하여 https://www.nuget.org/packages/IronPdf 설치하기
PM > Install-Package IronPdf -
다음 코드 조각을 복사하여 실행하세요.
var sig = PdfDocument.FromFile("signed.pdf").GetVerifiedSignatures().First(); var cert = sig.SignerCertificate; Console.WriteLine($"{cert?.CommonName} ({cert?.Organization}) valid until {cert?.NotAfter}"); -
실제 운영 환경에서 테스트할 수 있도록 배포하세요.
무료 체험판으로 오늘 프로젝트에서 IronPDF 사용 시작하기
최소 워크플로우 (3단계)
- NuGet에서 IronPDF를 다운로드하세요.
- 서명된 PDF를 불러온 후
GetVerifiedSignatures()를호출하여 검증된 서명 객체 목록을 가져옵니다. - 신원 및 유효성을 확인하려면
sig.SignerCertificate를참조하거나, 전체 신뢰 체인을 확인하려면sig.CertificateChain을탐색하십시오.
서명자의 주민등록번호 또는 개인 식별번호는 어떻게 추출하나요?
SubjectSerialNumber 속성은 인증서의 Subject DN에서 SERIALNUMBER OID의 값을 반환합니다. 규제 대상 산업(eIDAS 인증서, 은행, 정부 발급 디지털 ID)에서 이 필드에는 서명자의 주민등록번호, 납세자번호 또는 개인 식별 번호가 입력됩니다. 이는 인증서 자체의 일련번호가 아닙니다; 즉, 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
SubjectSerialNumber은 문서에 서명한 주체(Subject DN에 포함된 주민등록번호나 납세자번호와 같은 개인 또는 조직 ID)를 나타냅니다). CertificateSerialNumber는 어떤 인증서가 사용되었는지 알려줍니다; (이는 발급 인증 기관이 해지 목록 및 감사 로그를 위해 할당하는 고유한 일련 번호입니다.편의성 식별 속성에 어떻게 접근하나요?
SignerCertificateInfo은 가장 일반적으로 필요한 Subject DN 필드를 직접 속성으로 노출하므로, 전체 DN 문자열을 직접 파싱할 필요가 없습니다.
서명자의 이름 및 소속 읽기
CommonName, Organization, Country 및 Email 속성은 대부분의 신원 관리 워크플로가 가장 먼저 활용하는 기능을 다룹니다.
: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
Email 속성은 먼저 Subject DN에서 emailAddress OID를 확인합니다. 해당 항목이 없는 경우, Subject Alternative Name(SAN) rfc822Name 확장명으로 대체됩니다. Country 속성은 두 글자짜리 ISO 3166-1 알파-2 코드(예: "DE", "US", "FR")를 반환합니다. 해당 필드가 인증서에 존재하지 않는 경우, 모든 편의 속성은 null를 반환합니다.
모든 내용이 필요할 때 전체 DN 읽기
감사 로깅, 다운스트림 파싱 또는 규정 준수 보고서를 위해 SubjectDN 및 IssuerDN는 전체 Distinguished Name 문자열을 반환합니다.
: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
임의의 주제 및 발행자 필드는 어떻게 추출하나요?
GetSubjectField(string) 및 GetIssuerField(string) 메서드는 짧은 이름이나 숫자형 OID를 모두 허용합니다. 대소문자를 구분하지 않으며, 해당 필드가 존재하지 않을 경우 null를 반환합니다.
지원되는 약칭: CN, O, OU, C, L, ST, E, SERIALNUMBER, SURNAME, T, GIVENNAME, UID, ORGANIZATIONIDENTIFIER.
모든 주제 분야 읽기 (eIDAS OID 포함)
"OU"와 같은 짧은 이름이나 "2.5.4.97"(eIDAS organizationIdentifier)와 같은 숫자형 OID를 전달하여 Subject DN의 모든 필드를 가져올 수 있습니다.
: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
숫자형 OID 조회는 표준 약칭으로 표기되지 않는 조직 식별자, Professional 자격 또는 관할권별 필드가 포함된 eIDAS 및 규제 산업용 인증서에 필수적입니다.
발행자 필드 읽기
GetIssuerField는 발급 CA의 고유 이름(Distinguished Name)에 대해서도 동일한 방식으로 작동합니다. 이는 신뢰성 검증, CA 보고, 발급 기관별 서명 그룹화에 유용합니다.
: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
인증서 유효성은 어떻게 확인하나요?
SignerCertificateInfo는 두 가지 유효성 검사 헬퍼를 제공합니다:
IsExpired는DateTime.UtcNow > NotAfter일 때true를 반환합니다.IsValidAt(DateTime)는 주어진 타임스탬프가NotAfter기간 내에 포함될 경우true를 반환합니다. 일반적인 용도는 서명 시점에 인증서가 유효했는지 확인하는 것입니다.
: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
IsExpired는 인증서에서 유효 기간을 추출할 수 없는 경우 false를 반환합니다(true가 아님). 이 헬퍼는 의도적으로 보수적인 방식을 취하며, 메타데이터가 누락되었다는 이유만으로 유효 기간이 만료되었다고 가정하지 않습니다. 제로 트러스트 워크플로의 경우, 유효 기간이 누락된 경우를 명시적으로 실패 사례로 처리하십시오.감사 추적을 위해 IsExpired 검사(현재 유효성)와 IsValidAt(signingDate) 검사(서명 시점의 유효성)를 모두 기록하십시오. 현재 만료된 인증서라도 문서가 서명되었을 당시에는 유효했을 수 있습니다; 두 데이터 포인트 모두 규정 준수에 중요합니다.
인증서 고정(Certificate Pinning)에 SHA-256 썸프린트를 어떻게 사용하나요?
Sha256Thumbprint 속성은 DER 인코딩된 인증서의 SHA-256 해시인 64자 대문자 16진수 문자열을 반환합니다. 이는 승인된 서명자 인증서 목록과 대조하여 확인하는 값입니다.
: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
원시 인증서 데이터로부터 X509Certificate2를 어떻게 생성합니까?
RawData 속성은 DER로 인코딩된 인증서를 byte[] 형식으로 반환합니다. 각 호출은 방어적 복사본을 반환하므로, 내부 데이터가 참조를 통해 노출되는 일은 절대 없습니다. 이를 사용하여 .NET의 네이티브 암호화 API(체인 구축, 정책 유효성 검사, CRL 확인)와의 상호 운용성을 위한 System.Security.Cryptography.X509Certificates.X509Certificate2를 구성할 수 있습니다.
: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
RawData에 대한 각 액세스마다 새로운 방어적 복사본이 반환됩니다. 내부 바이트 배열은 참조로 노출되지 않으므로, 반환된 바이트를 변경하더라도 이후 호출에는 영향을 미치지 않습니다.이 상호 운용성 경로를 사용하면 X509Chain.Build(), CRL/OCSP를 통한 해지 확인 또는 사용자 지정 X509CertificateValidator 구현과 같은 기존 .NET 인증서 유효성 검사 파이프라인에 IronPDF의 서명 검증을 통합할 수 있습니다.
인증서 체인을 어떻게 추적합니까?
CertificateChain 속성은 VerifiedSignature에 대해 서명자 → 중간 CA(들) → 루트 CA 순서로 정렬된 IReadOnlyList<SignerCertificateInfo>를 반환합니다. 인덱스 0은 항상 서명자 인증서입니다(SignerCertificate와 동일한 객체). 이 목록은 절대 null이 아닙니다; 체인(chain)을 추출할 수 없는 경우, 해당 체인에는 서명자 인증서만 포함됩니다.
: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
SignerCertificateInfo은 SignerCertificate과 동일한 속성을 노출합니다: 식별자 필드, 유효성, 썸프린트, RawData, GetSubjectField() 및 GetIssuerField(). (중간 CA의 만료일을 모두 확인하고, 신뢰할 수 있는 루트 저장소에 있는 루트 인증서의 썸프린트를 대조하며, 규정 준수 감사를 위해 전체 체인을 기록할 수 있습니다.다음 단계
SignerCertificate 및 CertificateChain을 사용하면 IronPDF API 환경을 벗어나지 않고도 X.509 인증서를 완벽하게 검사할 수 있습니다. 이제 다음 단계로, 이러한 속성이 통합되는 IronPDF의 세부 기능들을 더 깊이 살펴볼 차례입니다.
워크플로의 서명 단계와 관련하여, 디지털 서명 사용 안내서는 인증서 생성, 메타데이터 및 증분 서명을 다룹니다. 고보안 환경에서의 HSM 기반 서명을 위해, HSM 서명 가이드에서는 PKCS#11 통합에 대해 다룹니다. 바로 사용할 수 있는 코드 예제가 필요하신가요? 디지털 서명 코드 예제가 이를 제공합니다.
직접 서명된 PDF 파일로 사용해 보시겠습니까? 30일 무료 체험을 시작하거나 라이선스 옵션을 확인하세요.

