Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
Aspose.PDF for .NET предоставляет возможность добавлять цифровые подписи из хранилища ключей. Вы можете применить подпись, приняв сертификат, предоставленный хранилищем сертификатов, смарт-картой или PIV-картой, подключённой к системе во время выполнения.
Следующий фрагмент кода также работает с библиотекой Aspose.PDF.Drawing.
Ниже приведены фрагменты кода для подписания PDF-документа с помощью смарт-карты:
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void GetSignatureInfo()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open a document stream
using (var fs = new FileStream(dataDir + "blank.pdf", FileMode.Open, FileAccess.ReadWrite))
{
// Open PDF document from stream
using (var document = new Aspose.Pdf.Document(fs))
{
// Create a signature field
var field1 = new Aspose.Pdf.Forms.SignatureField(document.Pages[1], new Aspose.Pdf.Rectangle(100, 400, 10, 10));
// Sign with certificate selection in the windows certificate store
var store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
// Manually chose the certificate in the store
var sel = X509Certificate2UI.SelectFromCollection(store.Certificates, null, null, X509SelectionFlag.SingleSelection);
// Set an external signature settings
var externalSignature = new Aspose.Pdf.Forms.ExternalSignature(sel[0])
{
Authority = "Me",
Reason = "Reason",
ContactInfo = "Contact"
};
// Set a name of signature field
field1.PartialName = "sig1";
// Add the signature field to the document
document.Form.Add(field1, 1);
// Sign the document
field1.Sign(externalSignature);
// Save PDF document
document.Save(dataDir + "externalSignature1_out.pdf");
}
}
}
private static void VerifyExternalSignature()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "externalSignature1.pdf"))
{
using (var pdfSign = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
var sigNames = pdfSign.GetSignatureNames();
for (int index = 0; index <= sigNames.Count - 1; index++)
{
if (!pdfSign.VerifySignature(sigNames[index]))
{
throw new Exception("Not verified");
}
}
}
}
}
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private void SignWithSmartCard()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "blank.pdf"))
{
using (var pdfSign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
pdfSign.BindPdf(document);
// Sign with certificate selection in the windows certificate store
var store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
// Manually chose the certificate in the store
var sel = X509Certificate2UI.SelectFromCollection(store.Certificates, null, null, X509SelectionFlag.SingleSelection);
// Set an external signature settings
var externalSignature = new Aspose.Pdf.Forms.ExternalSignature(sel[0]);
pdfSign.SignatureAppearance = dataDir + "demo.png";
// Sign the document
pdfSign.Sign(1, "Reason", "Contact", "Location", true, new System.Drawing.Rectangle(100, 100, 200, 200), externalSignature);
// Save PDF document
pdfSign.Save(dataDir + "externalSignature2_out.pdf");
}
}
}
private static void VerifyExternalSignature()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "externalSignature1.pdf"))
{
using (var pdfSign = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
var sigNames = pdfSign.GetSignatureNames();
for (int index = 0; index <= sigNames.Count - 1; index++)
{
if (!pdfSign.VerifySignature(sigNames[index]))
{
throw new Exception("Not verified");
}
}
}
}
}
Вы можете использовать класс ExternalSignature для внешней службы подписания. ExternalSignature создаёт подписи PKCS7 и PKCS7 detached. Вы можете передать желаемый алгоритм хеширования конструктору ExternalSignature. Обратите внимание, что для не detached подписей можно использовать только SHA1. Он будет выбран автоматически, если вы явно не укажете алгоритм хеширования. Для не detached подписей это будет SHA1; для detached — SHA-256 для ключа RSA. Для ключа ECDSA размер хэша зависит от размера ключа.
Конструктор ExternalSignature также принимает ключевой сертификат (он может быть в формате Base64). Вы можете передать сертификат, содержащий закрытый ключ, и сертификат, содержащий только открытый ключ. В любом случае подпись будет выполнена внешне в коде делегата CustomSignHash, но внешний алгоритм должен создать подпись, соответствующую ключу переданного сертификата. Сертификат необходим для правильного формирования подписанного документа. Подпись ECDSA не поддерживает SHA-1.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void SignWithExternalService()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "blank.pdf"))
{
using (var sign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
sign.BindPdf(document);
// Get public certificate
X509Certificate2 signerCert = GetPublicCertificate();
// Set a certificate and a digest algorithm
var signature = new Aspose.Pdf.Forms.ExternalSignature(signerCert, Aspose.Pdf.DigestHashAlgorithm.Sha256);
// Define a delegate to external sign
Aspose.Pdf.Forms.SignHash customSignHash = delegate(byte[] signableHash, Aspose.Pdf.DigestHashAlgorithm digestHashAlgorithm)
{
return CallExternalSignatureService(signableHash, digestHashAlgorithm);
};
// Set a sign hash
signature.CustomSignHash = customSignHash;
sign.Sign(1, "reason", "cont", "loc", false, new System.Drawing.Rectangle(0, 0, 500, 500), signature);
// Save PDF document
sign.Save(dataDir + "ExternalSignature_out.pdf");
}
}
}
private static X509Certificate2 GetPublicCertificate()
{
// Your code to get a public certificate. The certificate can be supplied by a third-party service or a smart card
}
private static byte[] CallExternalSignatureService(byte[] hash, Aspose.Pdf.DigestHashAlgorithm digestHashAlgorithm)
{
// Call a third-party service that provides a digital signature service
// The method must return signed data
// The digestHashAlgorithm argument points to the digest algorithm that was applied to the data to produce the value of the hash argument
}
Для создания подписи требуется предварительная оценка длины будущей цифровой подписи. Если вы используете SignHash для создания цифровой подписи, вы можете обнаружить, что делегат вызывается дважды в процессе сохранения документа. Если по какой-то причине вы не можете позволить себе два вызова, например, если во время вызова появляется запрос PIN-кода, вы можете использовать опцию AvoidEstimatingSignatureLength для классов PKCS1, PKCS7, PKCS7Detached и ExternalSignature. Установка этой опции позволяет избежать этапа оценки длины подписи, устанавливая фиксированное значение в качестве ожидаемой длины — DefaultSignatureLength. Значение по умолчанию для свойства DefaultSignatureLength равно 3000 байтам. Опция AvoidEstimatingSignatureLength работает только в том случае, если в свойстве CustomSignHash установлен делегат SignHash. Если полученная длина подписи превышает ожидаемую длину, указанную свойством DefaultSignatureLength, вы получите исключение SignatureLengthMismatchException, указывающее фактическую длину. Вы можете настроить значение параметра DefaultSignatureLength по своему усмотрению.
Для ExternalSignature опцию AvoidEstimatingSignatureLength можно использовать, даже если CustomSignHash не используется.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void SignWithExternalService()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "blank.pdf"))
{
using (var sign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
sign.BindPdf(document);
// Get public certificate
X509Certificate2 signerCert = GetPublicCertificate();
// Set a certificate and a digest algorithm
var signature = new Aspose.Pdf.Forms.ExternalSignature(signerCert, Aspose.Pdf.DigestHashAlgorithm.Sha256);
// Define a delegate to external sign
Aspose.Pdf.Forms.SignHash customSignHash = delegate(byte[] signableHash, Aspose.Pdf.DigestHashAlgorithm digestHashAlgorithm)
{
return CallExternalSignatureService(signableHash, digestHashAlgorithm);
};
// Set a sign hash
signature.CustomSignHash = customSignHash;
// Set an option to avoiding twice SignHash calling.
signature.AvoidEstimatingSignatureLength = true;
signature.DefaultSignatureLength = 3500;
sign.Sign(1, "reason", "cont", "loc", false, new System.Drawing.Rectangle(0, 0, 500, 500), signature);
// Save PDF document
sign.Save(dataDir + "ExternalSignature_out.pdf");
}
}
}
private static X509Certificate2 GetPublicCertificate()
{
// Your code to get a public certificate. The certificate can be supplied by a third-party service or a smart card
}
private static byte[] CallExternalSignatureService(byte[] hash, Aspose.Pdf.DigestHashAlgorithm digestHashAlgorithm)
{
// Call a third-party service that provides a digital signature service
// The method must return signed data
// The digestHashAlgorithm argument points to the digest algorithm that was applied to the data to produce the value of the hash argument
}
Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.