Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
Aspose.PDF for .NET은 SignatureField 클래스를 사용하여 PDF 파일에 디지털 서명을 추가하는 기능을 지원합니다. 또한 PKCS12 인증서를 사용하여 PDF 파일을 인증할 수 있습니다. 이는 Adding Signatures and Security in Adobe Acrobat과 유사합니다.
PDF 문서에 서명을 할 때, 기본적으로 현재 내용을 “있는 그대로” 확인하는 것입니다. 따라서 이후에 이루어지는 모든 변경은 서명을 무효화시키며, 이를 통해 문서가 변경되었는지 여부를 알 수 있습니다. 반면, 먼저 문서를 인증하면 사용자가 문서를 변경하더라도 인증을 무효화하지 않는 변경 사항을 지정할 수 있습니다.
즉, 문서는 여전히 무결성을 유지한다고 간주될 수 있으며 수신자는 여전히 문서를 신뢰할 수 있습니다. 자세한 내용은 Certifying and signing a PDF를 참조하십시오. 일반적으로 문서를 인증하는 것은 .NET 실행 파일에 대한 코드 서명과 비교할 수 있습니다.
다음 코드 스니펫은 Aspose.PDF.Drawing 라이브러리와도 함께 작동합니다.
PDF 서명을 위해 다음 클래스와 메서드를 사용할 수 있습니다.
PKCS12 인증서(.p12, .pfx) 기반 디지털 서명을 만들려면 PdfFileSignature 클래스의 인스턴스를 생성하고 문서 객체를 전달해야 합니다.
다음으로, 아래 클래스 중 하나의 객체를 만들어 원하는 디지털 서명 방식을 지정합니다.
PKCS7Detached에만 다이제스트 알고리즘을 설정할 수 있습니다. PKCS1 및 PKCS7의 경우 다이제스트 알고리즘은 항상 SHA-1로 설정됩니다.
그 후, 얻은 서명 알고리즘 객체를 PdfFileSignature.Sign() 메서드에 사용합니다. 문서를 저장하면 디지털 서명이 문서에 적용됩니다.
아래 예제는 SHA-1 다이제스트 알고리즘을 사용한 PKCS7 비분리 서명을 생성합니다.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void SignDocument()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "DigitallySign.pdf"))
{
// Instantiate PdfFileSignature object
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
// Create PKCS#7 object for sign
var pkcs = new Aspose.Pdf.Forms.PKCS7(dataDir + "rsa_cert.pfx", "12345");
// Sign PDF file
signature.Sign(1, true, new System.Drawing.Rectangle(300, 100, 400, 200), pkcs);
// Save PDF document
signature.Save(dataDir + "DigitallySign_out.pdf");
}
}
}
아래 예제는 SHA-256 다이제스트 알고리즘을 사용한 PKCS7Detached 형식의 분리 서명을 생성합니다. 키 알고리즘은 인증서 키에 따라 달라지며 DSA, RSA, ECDSA를 지원합니다.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void SignDocument(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "DigitallySign.pdf"))
{
// Instantiate PdfFileSignature object using the opened document
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
// Create PKCS#7 detached object for sign
var pkcs = new Aspose.Pdf.Forms.PKCS7Detached(pfxFilePath, password, Aspose.Pdf.DigestHashAlgorithm.Sha256);
// Sign PDF file
signature.Sign(1, true, new System.Drawing.Rectangle(300, 100, 400, 200),pkcs);
// Save PDF document
signature.Save(dataDir + "DigitallySign_out.pdf");
}
}
}
PdfFileSignature.VerifySignature() 메서드를 사용하여 서명을 검증할 수 있습니다. 이전에는 GetSignNames() 메서드로 서명 이름을 가져왔지만, 버전 25.02부터는 GetSignatureNames() 메서드를 사용해야 하며, 이는 SignatureName 목록을 반환합니다. SignatureName은 동일한 이름을 가진 서명을 검증할 때 충돌을 방지합니다. 문자열 서명 이름 대신 SignatureName 타입을 받는 메서드를 사용하십시오.
주의: PdfFileSignature.VerifySigned() 메서드는 더 이상 사용되지 않습니다.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void Verify()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "signed_rsa.pdf"))
{
// Create an instance of PdfFileSignature for working with signatures in the document
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
// Get a list of signature names in the document
var sigNames = signature.GetSignatureNames();
// Loop through all signature names to verify each one
foreach (var sigName in sigNames)
{
// Verify that the signature with the given name is valid
if (!signature.VerifySignature(sigName))
{
throw new Exception("Not verified");
}
}
}
}
}
문서를 서명할 때 사용된 개인 키에 대응하는 공개 키가 포함된 외부 인증서를 사용하여 서명을 검증할 수 있습니다.
서명에서 인증서를 추출하고 이를 사용해 서명을 검증할 수 있습니다.
디지털 서명을 검증할 때 서명 인증서의 폐기 여부를 확인할 수 있습니다.
안타깝게도 Aspose.PDF는 인증서 체인에 있는 루트 또는 중간 인증서의 진위 여부를 검증할 수 없습니다. 따라서 서명 인증서의 폐기 상태만 CRL 및 OCSP를 통해 확인합니다.
인증서 검증을 구성하려면 ValidationOptions 매개변수를 사용할 수 있습니다.
ValidationMode 옵션은 세 가지 검증 모드를 제공합니다.
Verify 메서드 결과에 영향을 줌.ValidationMethod는 인증서를 확인하는 방법을 지정합니다.
CheckCertificateChain 옵션은 서명에 인증서 체인이 포함되어 있는지 확인합니다. 체인이 없으면 인증서 검증 결과는 Undefined가 됩니다.
검증 결과는 ValidationResult 타입의 출력 매개변수를 통해 얻을 수 있습니다. 가능한 상태는 Valid, Invalid, Undefined이며, Undefined는 일반적으로 인증서를 검증할 수 없거나 인증서 체인이 누락된 경우를 의미합니다.
CheckCertificateChain와 ValidationMode = ValidationMode.Strict를 동시에 설정하면 Adobe Acrobat의 동작과 동일합니다. Adobe Acrobat이 인증서 체인을 찾지 못하면 폐기 상태를 확인하지 않으며 서인은 무효로 간주됩니다.
Aspose.PDF for .NET은 타임스탬프 서버 또는 웹 서비스를 이용해 PDF에 디지털 서명을 추가하는 기능을 지원합니다.
이를 위해 Aspose.PDF 네임스페이스에 TimestampSettings(https://reference.aspose.com/pdf/net/aspose.pdf/timestampsettings) 클래스가 추가되었습니다. 아래 코드 스니펫을 참고하면 타임스탬프를 가져와 PDF 문서에 추가할 수 있습니다.
원하는 인증서에 대응하는 타임스탬프를 디지털 서명에 포함시킬 수 있으며, 타임스탬프 자체를 독립적인 서명으로 만들 수도 있습니다.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void SignWithTimeStampServer()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "SimpleResume.pdf"))
{
// Create an instance of PdfFileSignature for working with signatures in the document
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
// Create TimestampSettings settings
var timestampSettings = new Aspose.Pdf.TimestampSettings("https://freetsa.org/tsr", string.Empty); // User/Password can be omitted
var pkcs = new Aspose.Pdf.Forms.PKCS7(timestampSettings);
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(100, 100, 200, 100);
// Create any of the three signature types
signature.Sign(1, "Signature Reason", "Contact", "Location", true, rect, pkcs);
// Save PDF document
signature.Save(dataDir + "DigitallySignWithTimeStamp_out.pdf");
}
}
}
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void SignWithEmbeddedTimestamp(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "SimpleResume.pdf"))
{
// Create an instance of PdfFileSignature for working with signatures in the document
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
var pkcs = new Aspose.Pdf.Forms.PKCS7(pfxFilePath, password);
// Create TimestampSettings settings
var timestampSettings = new Aspose.Pdf.TimestampSettings("https://freetsa.org/tsr", string.Empty); // User/Password can be omitted
pkcs.TimestampSettings = timestampSettings;
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(100, 100, 200, 100);
// Create any of the three signature types
signature.Sign(1, "Signature Reason", "Contact", "Location", true, rect, pkcs);
// Save PDF document
signature.Save(dataDir + "DigitallySignWithTimeStamp_out.pdf");
}
}
}
이 코드는 외부 인증서를 사용해 PDF를 서명하며, 서버와 통신해 서명된 해시를 받아 PDF에 삽입할 수 있습니다.
PDF 서명 단계:
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void SignWithBase64Certificate(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
var base64Str = "Certificate in base64 format";
using (var pdfSign = new Aspose.Pdf.Facades.PdfFileSignature())
{
var sign = new Aspose.Pdf.Forms.ExternalSignature(base64Str, false);// without Private Key
sign.ShowProperties = false;
// Create a delegate to external sign
Aspose.Pdf.Forms.SignHash customSignHash = delegate (byte[] signableHash, Aspose.Pdf.DigestHashAlgorithm digestHashAlgorithm)
{
// Simulated Server Part (This will probably just be sending data and receiving a response)
var signerCert = new X509Certificate2(pfxFilePath, password, X509KeyStorageFlags.Exportable);// must have Private Key
var rsaCSP = new RSACryptoServiceProvider();
var xmlString = signerCert.PrivateKey.ToXmlString(true);
rsaCSP.FromXmlString(xmlString);
byte[] signedData = rsaCSP.SignData(signableHash, CryptoConfig.MapNameToOID("SHA1"));
return signedData;
};
sign.CustomSignHash = customSignHash;
// Bind PDF document
pdfSign.BindPdf(dataDir + "input.pdf");
// Sign the file
pdfSign.Sign(1, "second approval", "second_user@example.com", "Australia", false,
new System.Drawing.Rectangle(200, 200, 200, 100),
sign);
// Save PDF document
pdfSign.Save(dataDir + "SignWithBase64Certificate_out.pdf");
}
}
사용자 정의 해시 서명 함수를 사용하면 서명 기관이 표준 서명 방식보다 더 높은 보안 정책이나 특정 암호 표준을 구현할 수 있어 문서 무결성을 보장합니다.
이 접근 방식은 서명 적용 이후 문서가 변경되지 않았음을 검증하고, PFX 인증서를 사용해 서명자의 신원을 입증하는 법적 구속력을 갖는 디지털 서명을 제공합니다.
아래 코드는 C#에서 PFX(PKCS#12) 인증서와 사용자 정의 해시 서명 함수를 사용해 PDF 문서를 디지털 서명하는 예시입니다.
DPF 서명 프로세스를 자세히 살펴보겠습니다:
파일 경로 및 인증서 정보 정의
서명 프로세스
PdfFileSignature 객체를 생성하고 입력 PDF에 바인딩합니다.PKCS7 객체를 초기화하고, CustomSignHash 메서드를 사용자 정의 해시 서명 함수로 지정합니다.Sign 메서드를 호출해 페이지 번호(예: 1), 서명 세부 정보(이유, 연락처, 위치) 및 서명 위치(좌표 (0,0,500,500)인 사각형)를 지정합니다.사용자 정의 해시 서명
CustomSignHash 메서드는 서명 가능한 해시(byte 배열)를 매개변수로 받습니다.RSACryptoServiceProvider와 SHA-1 알고리즘으로 해시를 서명합니다.다이제스트 알고리즘은 PKCS7Detached 생성자에서 지정할 수 있습니다. 사용자 정의 해시 서명 함수에서 타사 서비스를 호출할 수도 있습니다. CustomSignHash에서 사용되는 서명 알고리즘은 PKCS7/PKCS7Detached에 전달되는 인증서의 키 알고리즘과 일치해야 합니다.
아래 예제는 RSA 알고리즘과 SHA-1 다이제스트를 사용한 비분리 서명을 생성합니다. PKCS7Detached를 사용하면 ECDSA를 선택하고 원하는 다이제스트 알고리즘을 설정할 수 있습니다.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void SignWithCertificate(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
using (var sign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
sign.BindPdf(dataDir + "input.pdf");
// Create PKCS#7 object to sign
var pkcs7 = new Aspose.Pdf.Forms.PKCS7(pfxFilePath, password);// You can use PKCS7Detached with digest algorithm argument
// Set the delegate to external sign
pkcs7.CustomSignHash = CustomSignHash;
// Sign the file
sign.Sign(1, "reason", "cont", "loc", false, new System.Drawing.Rectangle(0, 0, 500, 500), pkcs7);
// Save PDF document
sign.Save(dataDir + "SignWithCertificate_out.pdf");
}
// Custom hash signing function to generate a digital signature
byte[] CustomSignHash(byte[] signableHash, Aspose.Pdf.DigestHashAlgorithm digestHashAlgorithm)
{
var inputP12 = "111.p12";
var inputPfxPassword = "123456";
X509Certificate2 signerCert = new X509Certificate2(inputP12, inputPfxPassword, X509KeyStorageFlags.Exportable);
RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
var xmlString = signerCert.PrivateKey.ToXmlString(true);
rsaCSP.FromXmlString(xmlString);
byte[] signedData = rsaCSP.SignData(signableHash, CryptoConfig.MapNameToOID("SHA1"));
return signedData;
}
}
서명을 만들려면 향후 디지털 서명의 길이에 대한 사전 추정이 필요합니다. SignHash를 사용해 디지털 서명을 만들 경우, 문서 저장 과정에서 delegate가 두 번 호출될 수 있습니다. PIN 코드 요청 등으로 두 번 호출이 어려운 경우, PKCS1, PKCS7, PKCS7Detached 및 ExternalSignature 클래스에서 AvoidEstimatingSignatureLength 옵션을 사용할 수 있습니다. 이 옵션은 예상 길이(DefaultSignatureLength)를 고정값으로 설정해 서명 길이 추정 단계를 건너뛰게 합니다. DefaultSignatureLength 기본값은 3000바이트입니다. AvoidEstimatingSignatureLength 옵션은 CustomSignHash 속성에 SignHash delegate가 설정된 경우에만 작동합니다. 결과 서명 길이가 DefaultSignatureLength에서 지정한 예상 길이를 초과하면 실제 길이를 알려주는 SignatureLengthMismatchException이 발생합니다. 필요에 따라 DefaultSignatureLength 값을 조정할 수 있습니다.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void SignWithCertificate(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
using (var sign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
sign.BindPdf(dataDir + "input.pdf");
// Create PKCS#7 object to sign
var pkcs7 = new Aspose.Pdf.Forms.PKCS7(pfxFilePath, password);// You can use PKCS7Detached with digest algorithm argument
// Set the delegate to external sign
pkcs7.CustomSignHash = CustomSignHash;
// Set an option to avoiding twice SignHash calling.
pkcs7.AvoidEstimatingSignatureLength = true;
// Sign the file
sign.Sign(1, "reason", "cont", "loc", false, new System.Drawing.Rectangle(0, 0, 500, 500), pkcs7);
// Save PDF document
sign.Save(dataDir + "SignWithCertificate_out.pdf");
}
// Custom hash signing function to generate a digital signature
byte[] CustomSignHash(byte[] signableHash, Aspose.Pdf.DigestHashAlgorithm digestHashAlgorithm)
{
var inputP12 = "111.p12";
var inputPfxPassword = "123456";
X509Certificate2 signerCert = new X509Certificate2(inputP12, inputPfxPassword, X509KeyStorageFlags.Exportable);
RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
var xmlString = signerCert.PrivateKey.ToXmlString(true);
rsaCSP.FromXmlString(xmlString);
byte[] signedData = rsaCSP.SignData(signableHash, CryptoConfig.MapNameToOID("SHA1"));
return signedData;
}
}
ECDSA(타원곡선 디지털 서명 알고리즘)를 사용해 PDF 문서를 서명하면 타원곡선 암호화를 활용해 높은 보안성과 효율성을 제공합니다. 이는 특히 모바일 및 리소스가 제한된 환경에서 유용합니다. 이 방법을 통해 PDF 문서를 타원곡선 암호화의 보안 이점을 갖는 디지털 서명으로 보호할 수 있습니다.
Aspose.PDF는 ECDSA 기반 디지털 서명 생성 및 검증을 지원합니다. 다음 타원곡선을 사용해 디지털 서명을 만들고 검증할 수 있습니다:
기본 다이제스트 알고리즘은 ECDSA 키 크기에 따라 길이가 결정되는 SHA2이며, PKCS7Detached 생성자에서 직접 지정할 수 있습니다.
다음 다이제스트 알고리즘을 사용해 ECDSA 디지털 서명을 생성할 수 있습니다: SHA-256, SHA-384, SHA3–512, SHA3–256, SHA3–384, SHA3–512. 검증도 동일한 알고리즘을 지원합니다.
OpenSSL을 사용해 PFX(output.pfx) 인증서를 생성하면 서명 및 검증을 테스트할 수 있습니다.
openssl ecparam -genkey -name brainpoolP512r1 -out private.key
openssl ec -in private.key -pubout -out public.pem
openssl req -new -x509 -days 365 -key private.key -out certificate.crt -subj "/C=PL/ST=Silesia/L=Katowice/O=My2 Organization/CN=example2.com"
openssl pkcs12 -export -out output.pfx -inkey private.key -in certificate.crt
Aspose.PDF에서 서명 및 검증에 사용할 수 있는 곡선 이름( OpenSSL에서 openssl ecparam -list_curves 명령으로 확인 가능): prime256v1, secp384r1, secp521r1, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1.
C#에서 ECDSA를 사용해 PDF 문서를 서명하는 일반적인 단계:
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void VerifyEcda()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "signed_ecdsa.pdf"))
{
// Create an instance of PdfFileSignature for working with signatures in the document
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
// Check if the document contains any digital signatures
if (!signature.ContainsSignature())
{
throw new Exception("Not contains signature");
}
// Get a list of signature names in the document
var sigNames = signature.GetSignatureNames();
// Loop through all signature names to verify each one
foreach (var sigName in sigNames)
{
// Verify that the signature with the given name is valid
if (!signature.VerifySignature(sigName))
{
throw new Exception("Not verified");
}
}
}
}
}
private static void SignEcdsa(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Create an instance of PdfFileSignature to sign the document
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
// Create a PKCS7Detached object using the provided certificate and password
var pkcs = new Aspose.Pdf.Forms.PKCS7Detached(cert, "12345", Aspose.Pdf.DigestHashAlgorithm.Sha256);
// Sign the first page of the document, setting the signature's appearance at the specified location
signature.Sign(1, true, new System.Drawing.Rectangle(300, 100, 400, 200), pkcs);
// Save PDF document
signature.Save(dataDir + "SignEcdsa_out.pdf");
}
}
}
Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.