ASP.NET Core에서 PDF 디지털 서명 추가 방법
ASP.NET Core에서 PDF에 디지털 서명을 추가하면 문서의 무결성을 보호하고 서명자의 신원을 확인하며 대부분의 법적 관할지에서 파일의 법적 방어력을 제공합니다. IronPDF를 사용하면 인증서 파일을 사용하여 서버 측에서 PDF에 서명하고, 눈에 보이는 서명 이미지를 추가하며, 대화형 서명 양식 필드를 임베드할 수 있습니다 — 이 모든 것을 몇 줄의 C# 코드 안에 구현하세요.
NuGet에서 라이브러리를 설치하고, .pfx 인증서를 획득한 후, 아래 예제를 따라하여 프로덕션 준비가 된 문서 서명 워크플로우를 구축하십시오.
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
또한 Visual Studio 내부의 NuGet 패키지 관리자에서 설치하거나 IronPDF 제품 페이지에서 직접 다운로드할 수 있습니다. 무료 체험 시작하여 모든 서명 기능을 테스트하고 아무런 약정 없이 사용할 수 있습니다.
PDF 디지털 서명이란 무엇이며 왜 중요한가요?
디지털 서명은 서명자의 신원을 문서의 특정 버전에 연결하는 암호화 메커니즘입니다. 이는 단순히 타이핑 된 이름이나 스캔된 이미지처럼 간단한 전자 서명과 다르며, 공개 키 암호화를 사용하여 검증 가능하고 변조 방지된 봉인을 생성합니다.
누군가 PDF에 디지털 서명을 하면, 서명 소프트웨어는 문서 내용의 해시를 생성하고 서명자의 개인 키로 그 해시를 암호화합니다. 결과로 생성된 서명은 서명자의 공개 인증서와 함께 PDF 내에 임베드됩니다. 디지털 서명을 지원하는 모든 PDF 리더 — Adobe Acrobat Reader 및 최신 브라우저에 내장된 PDF 뷰어를 포함하여 — 는 공개 키로 해시를 복호화하고 문서의 새로 계산된 해시와 비교할 수 있습니다. 해시가 일치하면 문서는 진본이며 수정되지 않았습니다.
디지털 서명이 법적으로 중요한 이유
대부분의 국가에서 디지털 서명이 된 문서는 손으로 서명한 종이 계약과 동일한 법적 효력을 가집니다. 유럽 연합의 eIDAS 규정과 미국의 ESIGN 법은 일정 조건이 충족될 경우 전자 서명을 법적으로 유효한 것으로 인정합니다. 인증서 기반 디지털 서명은 그 요구 사항의 가장 강력한 층위를 충족합니다.
ASP.NET Core에서 디지털 서명이 도입되는 위치
ASP.NET Core 애플리케이션 내부에서 서버 측 서명은 처리 도중 문서를 자동으로 서명할 수 있게 해주며, 클라이언트 소프트웨어가 필요하지 않습니다. 계약서, 인보이스, 규정 준수 보고서, NDA는 생성되는 순간 모두 서명될 수 있으며, 서명된 파일은 사용자에게 직접 반환되거나 문서 관리 시스템에 저장될 수 있습니다. IronPDF는 HTML에서 PDF 렌더링에서 암호화 서명에 이르는 전체 파이프라인을 처리하여 저수준 PDF 사양 세부 사항을 건드리지 않고도 워크플로우를 구현할 수 있습니다.
ASP.NET Core 프로젝트에 IronPDF를 설치하는 방법은 무엇입니까?
가장 빠른 서명 환경으로 가는 길은 NuGet 패키지입니다. Visual Studio에서 패키지 관리자 콘솔을 열고 다음을 실행하세요:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
대안으로, Solution Explorer에서 프로젝트를 우클릭하고 "NuGet 패키지 관리"를 선택한 후 IronPdf를 검색하고 설치를 클릭하십시오. 설치 후, 컨트롤러 또는 서비스 클래스 상단에 다음 using 지시문을 추가하십시오:
using IronPdf;
using IronPdf.Signing;
using IronPdf;
using IronPdf.Signing;
Imports IronPdf
Imports IronPdf.Signing
IronPDF는 .NET 8 및 .NET 9/10을 대상으로 하므로 최신 ASP.NET Core 프로젝트에 자연스럽게 적합합니다. 초기 설정에 대한 자세한 단계별 설명은 IronPDF 빠른 시작 가이드를 참조하세요.
ASP.NET Core에서 인증서 파일로 PDF에 서명하는 방법은 무엇입니까?
가장 일반적인 서명 방법은 .pfx 또는 .p12 인증서 파일을 사용하는 것입니다. 이 파일들은 비공개 키와 공개 인증서 체인을 하나의 암호로 보호된 아카이브로 묶습니다. DigiCert 또는 GlobalSign과 같은 신뢰할 수 있는 인증 기관(CA)에서 구하거나 개발 및 테스트 목적으로 자체 서명된 인증서를 생성할 수 있습니다.
아래 예제는 HTML에서 PDF를 생성하고 인증서 기반의 디지털 서명을 적용합니다:
using IronPdf;
using IronPdf.Signing;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/sign-with-certificate", (IWebHostEnvironment env) =>
{
// Generate a PDF from HTML content
var renderer = new ChromePdfRenderer();
var document = renderer.RenderHtmlAsPdf("<h1>Contract Agreement</h1><p>Terms and conditions...</p>");
// Locate the PFX certificate on the server
string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
// Build the signature object
var signature = new PdfSignature(certPath, "yourPassword")
{
SigningContact = "legal@yourcompany.com",
SigningLocation = "Chicago, IL, USA",
SigningReason = "Document Approval"
};
// Apply the signature and save
document.Sign(signature);
string outputPath = Path.Combine(Path.GetTempPath(), "signed-contract.pdf");
document.SaveAs(outputPath);
return Results.File(outputPath, "application/pdf", "signed-contract.pdf");
});
app.Run();
using IronPdf;
using IronPdf.Signing;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/sign-with-certificate", (IWebHostEnvironment env) =>
{
// Generate a PDF from HTML content
var renderer = new ChromePdfRenderer();
var document = renderer.RenderHtmlAsPdf("<h1>Contract Agreement</h1><p>Terms and conditions...</p>");
// Locate the PFX certificate on the server
string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
// Build the signature object
var signature = new PdfSignature(certPath, "yourPassword")
{
SigningContact = "legal@yourcompany.com",
SigningLocation = "Chicago, IL, USA",
SigningReason = "Document Approval"
};
// Apply the signature and save
document.Sign(signature);
string outputPath = Path.Combine(Path.GetTempPath(), "signed-contract.pdf");
document.SaveAs(outputPath);
return Results.File(outputPath, "application/pdf", "signed-contract.pdf");
});
app.Run();
Imports IronPdf
Imports IronPdf.Signing
Imports Microsoft.AspNetCore.Mvc
Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()
app.MapPost("/sign-with-certificate", Function(env As IWebHostEnvironment)
' Generate a PDF from HTML content
Dim renderer = New ChromePdfRenderer()
Dim document = renderer.RenderHtmlAsPdf("<h1>Contract Agreement</h1><p>Terms and conditions...</p>")
' Locate the PFX certificate on the server
Dim certPath As String = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx")
' Build the signature object
Dim signature = New PdfSignature(certPath, "yourPassword") With {
.SigningContact = "legal@yourcompany.com",
.SigningLocation = "Chicago, IL, USA",
.SigningReason = "Document Approval"
}
' Apply the signature and save
document.Sign(signature)
Dim outputPath As String = Path.Combine(Path.GetTempPath(), "signed-contract.pdf")
document.SaveAs(outputPath)
Return Results.File(outputPath, "application/pdf", "signed-contract.pdf")
End Function)
app.Run()
ChromePdfRenderer는 유효한 HTML 문자열이나 URL을 PDF로 변환합니다. PdfSignature 생성자는 인증서 경로 및 비밀번호를 수용하며, 선택적인 속성들(SigningContact, SigningLocation, SigningReason)은 PDF 뷰어가 서명 패널에 표시할 메타데이터를 추가합니다. Sign 메서드는 암호 서명을 포함시키고, SaveAs는 서명된 파일을 디스크에 작성합니다.
메모리에서 서명된 파일 반환
임시 파일을 디스크에 쓰고 싶지 않은 경우, MemoryStream에 PDF를 저장하고 컨트롤러 액션에서 직접 반환하십시오:
var stream = new MemoryStream();
document.SaveAs(stream);
stream.Position = 0;
return Results.File(stream, "application/pdf", "signed-contract.pdf");
var stream = new MemoryStream();
document.SaveAs(stream);
stream.Position = 0;
return Results.File(stream, "application/pdf", "signed-contract.pdf");
Dim stream As New MemoryStream()
document.SaveAs(stream)
stream.Position = 0
Return Results.File(stream, "application/pdf", "signed-contract.pdf")
이 방법은 임시 파일 관리가 불필요한 오버헤드를 추가할 수 있는 고처리량 API에 적합합니다.
전체 속성 참조는 PdfSignature API 문서를 참조하십시오.
PDF에 서명 이미지를 추가하는 방법은 무엇입니까?
암호학적 서명은 문서의 무결성을 보호하지만 렌더링된 PDF에서는 보이지 않습니다. 특히 계약서나 편지를 포함하는 많은 작업 흐름에서는 페이지에 인쇄된 서명된 손글씨나 회사 도장과 같은 눈에 보이는 표현이 필요합니다.
IronPDF는 LoadSignatureImageFromFile 메서드를 통해 이를 지원합니다. 이 메서드는 이미지 경로, 페이지 인덱스 및 가시 서명의 위치와 크기를 정의하는 IronSoftware.Drawing.Rectangle를 수용합니다:
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/sign-with-visible-image", (IWebHostEnvironment env) =>
{
// Load an existing PDF (for example, an invoice template)
string pdfPath = Path.Combine(env.ContentRootPath, "Documents", "invoice.pdf");
var document = PdfDocument.FromFile(pdfPath);
// Paths to the certificate and the signature image
string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
string imagePath = Path.Combine(env.ContentRootPath, "Images", "signature.png");
// Define where the visible signature appears (x, y, width, height in points)
var signatureArea = new Rectangle(50, 680, 200, 80);
var signature = new PdfSignature(certPath, "yourPassword");
signature.LoadSignatureImageFromFile(imagePath, pageIndex: 0, signatureArea);
document.Sign(signature);
string outputPath = Path.Combine(Path.GetTempPath(), "signed-invoice.pdf");
document.SaveAs(outputPath);
return Results.File(outputPath, "application/pdf", "signed-invoice.pdf");
});
app.Run();
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/sign-with-visible-image", (IWebHostEnvironment env) =>
{
// Load an existing PDF (for example, an invoice template)
string pdfPath = Path.Combine(env.ContentRootPath, "Documents", "invoice.pdf");
var document = PdfDocument.FromFile(pdfPath);
// Paths to the certificate and the signature image
string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
string imagePath = Path.Combine(env.ContentRootPath, "Images", "signature.png");
// Define where the visible signature appears (x, y, width, height in points)
var signatureArea = new Rectangle(50, 680, 200, 80);
var signature = new PdfSignature(certPath, "yourPassword");
signature.LoadSignatureImageFromFile(imagePath, pageIndex: 0, signatureArea);
document.Sign(signature);
string outputPath = Path.Combine(Path.GetTempPath(), "signed-invoice.pdf");
document.SaveAs(outputPath);
return Results.File(outputPath, "application/pdf", "signed-invoice.pdf");
});
app.Run();
Imports IronPdf
Imports IronPdf.Signing
Imports IronSoftware.Drawing
Imports Microsoft.AspNetCore.Mvc
Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()
app.MapPost("/sign-with-visible-image", Function(env As IWebHostEnvironment)
' Load an existing PDF (for example, an invoice template)
Dim pdfPath As String = Path.Combine(env.ContentRootPath, "Documents", "invoice.pdf")
Dim document = PdfDocument.FromFile(pdfPath)
' Paths to the certificate and the signature image
Dim certPath As String = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx")
Dim imagePath As String = Path.Combine(env.ContentRootPath, "Images", "signature.png")
' Define where the visible signature appears (x, y, width, height in points)
Dim signatureArea As New Rectangle(50, 680, 200, 80)
Dim signature As New PdfSignature(certPath, "yourPassword")
signature.LoadSignatureImageFromFile(imagePath, pageIndex:=0, signatureArea)
document.Sign(signature)
Dim outputPath As String = Path.Combine(Path.GetTempPath(), "signed-invoice.pdf")
document.SaveAs(outputPath)
Return Results.File(outputPath, "application/pdf", "signed-invoice.pdf")
End Function)
app.Run()
눈에 보이는 서명 이미지는 특정한 페이지에 제공한 좌표에 조합됩니다. 암호학적 서명은 동시에 전체 문서에 적용되어, 한 번의 작업으로 보안과 시각적 확인을 모두 얻을 수 있습니다.
이미지가 메모리 내에 있는 경우(예: 데이터베이스나 클라우드 저장소에서 가져온 경우), 대신 LoadSignatureImageFromStream를 사용하십시오. 시각적 서명 옵션에 대한 자세한 내용을 보려면 PDF 서명 방법 가이드를 참조하세요.
외부 서명자용 서명 양식 필드를 만드는 방법은 무엇입니까?
일부 작업 흐름에서는 문서가 시스템에 의해 생성되지만 고객, 파트너 또는 규제 기관 등 외부 당사자가 서명해야 합니다. 그 당사자의 인증서를 미리 수집하는 대신, PDF에 전용 서명 양식 필드를 포함시키고 문서를 그들에게 보냅니다. 수신자는 PDF를 Adobe Acrobat Reader 또는 다른 호환 뷰어에서 열고 서명 필드를 클릭하여 자신의 인증서나 전자 서명을 적용합니다.
using IronPdf;
using IronPdf.Forms;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/generate-signable-form", (IWebHostEnvironment env) =>
{
// Render the document that requires a client signature
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(@"
<h1>Client Service Agreement</h1>
<p>Please review the terms below and sign in the field provided.</p>
<p>By signing, you confirm acceptance of all listed terms and conditions.</p>
");
// Define the signature field: name, page, x, y, width, height (in points)
var signatureField = new SignatureFormField(
"ClientSignature",
pageIndex: 0,
x: 50,
y: 600,
width: 300,
height: 100
);
pdf.Form.Add(signatureField);
string outputPath = Path.Combine(Path.GetTempPath(), "client-agreement.pdf");
pdf.SaveAs(outputPath);
return Results.File(outputPath, "application/pdf", "client-agreement.pdf");
});
app.Run();
using IronPdf;
using IronPdf.Forms;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/generate-signable-form", (IWebHostEnvironment env) =>
{
// Render the document that requires a client signature
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(@"
<h1>Client Service Agreement</h1>
<p>Please review the terms below and sign in the field provided.</p>
<p>By signing, you confirm acceptance of all listed terms and conditions.</p>
");
// Define the signature field: name, page, x, y, width, height (in points)
var signatureField = new SignatureFormField(
"ClientSignature",
pageIndex: 0,
x: 50,
y: 600,
width: 300,
height: 100
);
pdf.Form.Add(signatureField);
string outputPath = Path.Combine(Path.GetTempPath(), "client-agreement.pdf");
pdf.SaveAs(outputPath);
return Results.File(outputPath, "application/pdf", "client-agreement.pdf");
});
app.Run();
Imports IronPdf
Imports IronPdf.Forms
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Hosting
Imports Microsoft.Extensions.Hosting
Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()
app.MapGet("/generate-signable-form", Function(env As IWebHostEnvironment)
' Render the document that requires a client signature
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("
<h1>Client Service Agreement</h1>
<p>Please review the terms below and sign in the field provided.</p>
<p>By signing, you confirm acceptance of all listed terms and conditions.</p>
")
' Define the signature field: name, page, x, y, width, height (in points)
Dim signatureField = New SignatureFormField(
"ClientSignature",
pageIndex:=0,
x:=50,
y:=600,
width:=300,
height:=100
)
pdf.Form.Add(signatureField)
Dim outputPath As String = Path.Combine(Path.GetTempPath(), "client-agreement.pdf")
pdf.SaveAs(outputPath)
Return Results.File(outputPath, "application/pdf", "client-agreement.pdf")
End Function)
app.Run()
SignatureFormField 생성자 매개변수는 페이지의 필드 위치에 직접 대응됩니다. 수신자가 PDF를 열면 서명이 필요한 명확히 구분된 상자를 볼 수 있습니다. 완료된 양식은 시스템에 반환될 수 있으며, 여기에 로드하여 임베디드 서명을 검증하고 아카이브할 수 있습니다.
PDF 양식을 처리하는 더 많은 정보, 특히 제출된 양식 데이터를 읽어들이는 방법에 대해서는 PDF 양식 편집 가이드를 참조하세요.
디지털 서명을 프로그래밍 방식으로 검증하는 방법은 무엇입니까?
문서가 서명되어 반환된 후, 서명이 여전히 유효하며 문서가 변경되지 않았음을 확인해야 할 수 있습니다. IronPDF는 PdfDocument 객체를 통해 서명 확인을 제공합니다:
using IronPdf;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/verify-signature", (IWebHostEnvironment env) =>
{
string signedPath = Path.Combine(env.ContentRootPath, "Documents", "signed-contract.pdf");
var document = PdfDocument.FromFile(signedPath);
// Retrieve all embedded signatures
var signatures = document.GetSignatures();
foreach (var sig in signatures)
{
bool isValid = sig.VerifySignature();
string status = isValid
? $"Valid -- signed by {sig.SignerName} on {sig.SigningTime:D}"
: "INVALID -- document may have been tampered with";
Console.WriteLine(status);
}
return Results.Ok(new { SignatureCount = signatures.Count });
});
app.Run();
using IronPdf;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/verify-signature", (IWebHostEnvironment env) =>
{
string signedPath = Path.Combine(env.ContentRootPath, "Documents", "signed-contract.pdf");
var document = PdfDocument.FromFile(signedPath);
// Retrieve all embedded signatures
var signatures = document.GetSignatures();
foreach (var sig in signatures)
{
bool isValid = sig.VerifySignature();
string status = isValid
? $"Valid -- signed by {sig.SignerName} on {sig.SigningTime:D}"
: "INVALID -- document may have been tampered with";
Console.WriteLine(status);
}
return Results.Ok(new { SignatureCount = signatures.Count });
});
app.Run();
Imports IronPdf
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Hosting
Imports Microsoft.Extensions.Hosting
Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()
app.MapGet("/verify-signature", Function(env As IWebHostEnvironment)
Dim signedPath As String = Path.Combine(env.ContentRootPath, "Documents", "signed-contract.pdf")
Dim document = PdfDocument.FromFile(signedPath)
' Retrieve all embedded signatures
Dim signatures = document.GetSignatures()
For Each sig In signatures
Dim isValid As Boolean = sig.VerifySignature()
Dim status As String = If(isValid,
$"Valid -- signed by {sig.SignerName} on {sig.SigningTime:D}",
"INVALID -- document may have been tampered with")
Console.WriteLine(status)
Next
Return Results.Ok(New With {.SignatureCount = signatures.Count})
End Function)
app.Run()
GetSignatures()는 PDF에 포함된 모든 디지털 서명의 목록을 반환합니다. 각 PdfDigitalSignature 객체는 VerifySignature(), 서명자의 이름, 서명 시간, 그리고 인증서 체인을 노출합니다. 이 정보는 손상되거나 만료된 서명이 있는 PDF를 표시하는 감사 기록 또는 문서 관리 대시보드를 구축하기에 충분합니다.
운영 환경에서 인증서 관리를 처리하는 방법은 무엇입니까?
파일 시스템에 .pfx 파일을 저장하는 것은 개발 중에는 작동하지만 프로덕션에는 적합하지 않습니다. 인증서 파일에는 개인 키가 포함되어 있으며, 파일이 손상되면 해당 키로 서명된 모든 문서가 위험에 처할 수 있습니다.
Azure Key Vault 사용
Azure Key Vault는 개인 키가 저장소를 떠나지 않고 인증서를 저장하고 사용할 수 있게 해줍니다. .NET SDK는 공개 인증서 정보를 다운로드하는 CertificateClient를 제공합니다. 키 저장소 내에 개인 키를 유지하면서 실제 서명 작업을 수행하기 위해, Azure.Security.KeyVault.Keys 패키지를 사용하여 서버 측에서 암호학적 작업을 수행할 수 있습니다.
환경 변수 및 비밀 사용
더 작은 프로젝트의 경우, 인증서를 Base64 인코딩된 문자열로 환경 변수에 저장하거나 ASP.NET Core 비밀 관리자에 저장하고 런타임에 디코딩하세요:
string certBase64 = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT")
?? throw new InvalidOperationException("PDF_SIGNING_CERT environment variable is not set.");
byte[] certBytes = Convert.FromBase64String(certBase64);
string certPassword = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT_PASSWORD")
?? throw new InvalidOperationException("PDF_SIGNING_CERT_PASSWORD environment variable is not set.");
var signature = new PdfSignature(certBytes, certPassword);
string certBase64 = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT")
?? throw new InvalidOperationException("PDF_SIGNING_CERT environment variable is not set.");
byte[] certBytes = Convert.FromBase64String(certBase64);
string certPassword = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT_PASSWORD")
?? throw new InvalidOperationException("PDF_SIGNING_CERT_PASSWORD environment variable is not set.");
var signature = new PdfSignature(certBytes, certPassword);
Imports System
Dim certBase64 As String = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT")
If certBase64 Is Nothing Then
Throw New InvalidOperationException("PDF_SIGNING_CERT environment variable is not set.")
End If
Dim certBytes As Byte() = Convert.FromBase64String(certBase64)
Dim certPassword As String = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT_PASSWORD")
If certPassword Is Nothing Then
Throw New InvalidOperationException("PDF_SIGNING_CERT_PASSWORD environment variable is not set.")
End If
Dim signature = New PdfSignature(certBytes, certPassword)
이 패턴은 자격 증명을 소스 제어에서 제거하고 회전을 간단하게 만듭니다 -- 환경 변수를 업데이트하고 서비스를 다시 시작하세요.
여러 PDF를 효율적으로 일괄 서명하는 방법은 무엇입니까?
하나의 작업에서 수십 또는 수백 개의 문서에 서명해야 할 때 -- 예를 들어 월말에 전체 송장 배치를 서명하는 경우 -- 인증서를 한번 로딩하고 모든 문서에 걸쳐 PdfSignature 객체를 재사용하면 오버헤드를 줄입니다:
using IronPdf;
using IronPdf.Signing;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/batch-sign", (IWebHostEnvironment env) =>
{
string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
var signature = new PdfSignature(certPath, "yourPassword")
{
SigningReason = "Batch Invoice Approval"
};
string[] invoicePaths = Directory.GetFiles(
Path.Combine(env.ContentRootPath, "Invoices"),
"*.pdf"
);
string outputDir = Path.Combine(env.ContentRootPath, "Signed");
Directory.CreateDirectory(outputDir);
foreach (string invoicePath in invoicePaths)
{
var doc = PdfDocument.FromFile(invoicePath);
doc.Sign(signature);
string outputFile = Path.Combine(outputDir, Path.GetFileName(invoicePath));
doc.SaveAs(outputFile);
}
return Results.Ok(new { SignedCount = invoicePaths.Length });
});
app.Run();
using IronPdf;
using IronPdf.Signing;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/batch-sign", (IWebHostEnvironment env) =>
{
string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
var signature = new PdfSignature(certPath, "yourPassword")
{
SigningReason = "Batch Invoice Approval"
};
string[] invoicePaths = Directory.GetFiles(
Path.Combine(env.ContentRootPath, "Invoices"),
"*.pdf"
);
string outputDir = Path.Combine(env.ContentRootPath, "Signed");
Directory.CreateDirectory(outputDir);
foreach (string invoicePath in invoicePaths)
{
var doc = PdfDocument.FromFile(invoicePath);
doc.Sign(signature);
string outputFile = Path.Combine(outputDir, Path.GetFileName(invoicePath));
doc.SaveAs(outputFile);
}
return Results.Ok(new { SignedCount = invoicePaths.Length });
});
app.Run();
Imports IronPdf
Imports IronPdf.Signing
Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()
app.MapPost("/batch-sign", Function(env As IWebHostEnvironment)
Dim certPath As String = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx")
Dim signature As New PdfSignature(certPath, "yourPassword") With {
.SigningReason = "Batch Invoice Approval"
}
Dim invoicePaths As String() = Directory.GetFiles(
Path.Combine(env.ContentRootPath, "Invoices"),
"*.pdf"
)
Dim outputDir As String = Path.Combine(env.ContentRootPath, "Signed")
Directory.CreateDirectory(outputDir)
For Each invoicePath As String In invoicePaths
Dim doc = PdfDocument.FromFile(invoicePath)
doc.Sign(signature)
Dim outputFile As String = Path.Combine(outputDir, Path.GetFileName(invoicePath))
doc.SaveAs(outputFile)
Next
Return Results.Ok(New With {.SignedCount = invoicePaths.Length})
End Function)
app.Run()
루프 외부에서 PdfSignature 객체를 한 번 만들면 인증서 파일을 한 번만 읽고 구문 분석합니다. 각 반복에서는 개별 PDF를 로드하고 서명하며 저장합니다. 아주 큰 배치의 경우, Parallel.ForEach을 사용하여 문서를 병렬로 처리하는 것을 고려하십시오 -- 각 PdfDocument 인스턴스가 단일 스레드에 고립될 때 IronPDF의 서명 작업은 스레드 안전합니다.
일반적인 서명 오류를 해결하는 방법은 무엇입니까?
"인증서를 찾을 수 없음" 또는 "잘못된 비밀번호"
File.Exists(certPath)을 사용하여 인증서 경로를 두 번 확인한 후 PdfSignature에 전달하십시오. 인증서 비밀번호는 대소문자를 구분하며 정확하게 일치해야 합니다. 개발 중에는 간단한 비밀번호로 자가 서명된 인증서를 생성하는 것이 일반적입니다; 운영 환경에서는 비밀번호를 비밀로 취급하고 secrets manager에서 로드하세요.
PDF 뷰어에서 "서명이 유효하지 않음"
Adobe Acrobat에서 "유효하지 않은 서명" 경고는 보통 세 가지 경우 중 하나를 의미합니다: (1) 뷰어의 인증서 저장소에서 인증서를 신뢰하지 않거나, (2) 서명 후 문서가 수정되었거나, (3) 서명 인증서가 만료되었습니다. 운영 환경 사용을 위해, 신뢰할 수 있는 인증 기관(CA)에서 인증서를 받고 시스템 시간을 동기화하세요. 개발 중에는, Adobe가 자가 서명된 인증서를 임시로 신뢰하는 방법을 제공합니다.
Sign() 호출 후 "문서에 서명되지 않았음"
document.Sign(signature)을 호출하면 문서가 서명 대상으로 표시되지만, SaveAs를 호출하거나 스트림에 저장할 때만 서명이 최종화됩니다. Sign 후에 저장 메서드를 호출하고 출력 파일 경로가 쓰기 가능한지 확인하십시오.
전체 API 세부사항 및 문제 해결 리소스를 보려면 IronPDF 문서 허브와 IronPDF 객체 참조를 방문하세요. 지원이 필요하면, IronPDF 지원 페이지가 엔지니어링 팀과 연결해줍니다.
다음 단계는 무엇입니까?
ASP.NET Core에서 디지털 PDF 서명은 인증서를 로드하고, Sign을 호출하며 결과를 저장하는 세 가지 핵심 작업을 이해하면 간단해집니다. IronPDF는 암호화 작업을 처리하므로 애플리케이션의 비즈니스 로직에 집중할 수 있습니다.
문서 워크플로 빌드를 계속하려면, 다음 관련 주제를 탐색하세요:
- ASP.NET Core에서 HTML로부터 PDF 생성을 배우세요 -- 대부분의 서명 워크플로의 기초
- PDF 비밀번호와 권한 추가 방법 -- 서명과 암호화를 결합하여 최대 보안 제공
- PDF 병합 및 분할 방법 -- 서명 전에 복수 문서 패키지 작성
- IronPDF 라이선싱 옵션 -- 배포에 맞는 플랜 선택
- IronPDF NuGet 패키지 -- 최신 릴리스 및 변경 기록 확인
무료 IronPDF 체험판으로 시작하여 한 시간 이내에 첫 번째 서명된 PDF를 실행하세요. 질문이 있거나 엣지 케이스가 발생하면, Iron Software 지원 팀이 신뢰할 수 있고 법적으로 준수하는 문서 서명 워크플로를 구축하는 데 도움을 줍니다.
자주 묻는 질문
ASP.NET Core에서 디지털 서명이란 무엇입니까?
ASP.NET Core에서 디지털 서명은 PDF 문서의 진위성과 무결성을 확인하는 데 사용되는 디지털 왁스 봉인과 같습니다. 이는 문서가 법적으로 유효하고 변조되지 않았음을 보장합니다.
IronPDF를 사용하여 PDF 문서에 디지털 서명을 추가할 수 있습니까?
IronPDF를 사용하여 PDF 문서에 디지털 서명을 추가할 수 있으며, 이는 인증서를 포함하고 문서를 서명하도록 설정하여 안전성과 검증 가능성을 보장합니다.
디지털 서명이 내 비즈니스 문서에 중요한 이유는 무엇입니까?
디지털 서명은 계약 또는 인보이스와 같은 문서가 진본이고 변경되지 않았음을 확인하므로 잠재적인 법적 위험으로부터 비즈니스를 보호하는 데 매우 중요합니다.
IronPDF로 PDF에서 대화형 양식 필드를 만들 수 있습니까?
네, IronPDF는 PDF에서 대화형 양식 필드를 만들 수 있어 사용자 상호작용을 향상시키고 ASP.NET Core 응용 프로그램에서 문서 프로세스를 간소화할 수 있습니다.
PDF 문서에 눈에 보이는 서명을 추가할 수 있습니까?
네, IronPDF를 사용하여 PDF 문서에 눈에 보이는 서명을 추가할 수 있으며, 이는 수신자에게 문서가 안전하게 서명되고 검증되었음을 명확히 합니다.
PDF의 디지털 서명에 사용될 수 있는 인증서의 유형은 무엇입니까?
서명 시 요구되는 보안 및 신뢰 수준에 따라 자가 서명 인증서 및 신뢰할 수 있는 인증 기관에서 발급한 인증서를 포함하여 PDF의 디지털 서명에 다양한 유형의 인증서를 사용할 수 있습니다.
IronPDF는 PDF 문서가 변조되지 않았음을 어떻게 보장합니까?
IronPDF는 디지털 서명을 사용하여 PDF 문서의 무결성과 진위성을 검증함으로써 문서가 변조되지 않았음을 보장하며 서명 후 변경이 발생한 경우 수신자에게 알립니다.
ASP.NET Core 응용 프로그램에서 디지털 서명 프로세스를 자동화할 수 있습니까?
네, IronPDF를 사용하여 ASP.NET Core 응용 프로그램에서 디지털 서명 프로세스를 자동화할 수 있으며, 이는 일괄 처리 및 기존 워크플로우 통합을 허용합니다.


