Работа с цифровыми подписями
Цифровая подпись - это технологическая реализация электронных подписей для подписи документов и аутентификации подписавшего лица, гарантирующая, что документ не был изменен с момента его подписания. Каждая цифровая подпись уникальна для каждого подписавшего лица благодаря использованию протокола PKI для генерации как открытых, так и закрытых ключей. Цифровая подпись документа означает создание подписи с использованием закрытого ключа подписывающего лица, где для шифрования сгенерированного хэша используется математический алгоритм.
Aspose.Words позволяет обнаруживать, подсчитывать или проверять существующие цифровые подписи, а также добавлять новую подпись к документу, чтобы выявить возможные нарушения. Вы также можете удалить все цифровые подписи из документа. Используйте класс DigitalSignatureUtil для работы с цифровыми подписями.
В этой статье объясняется, как выполнить все вышеперечисленное для проверки подлинности и целостности цифрового документа.
Попробуйте онлайн
Вы можете опробовать эту функцию с нашим Бесплатный онлайн-подпись.
Поддерживаемые форматы
Aspose.Words позволяет работать с цифровыми подписями в документах DOC, OOXML и ODT и подписывать сгенерированный документ в формате PDF или XPS.
Ограничения, связанные с цифровыми подписями
В таблице ниже описаны некоторые ограничения, с которыми вы можете столкнуться при работе с цифровыми подписями через Aspose.Words, а также некоторые альтернативные варианты.
Ограничение | Альтернативный вариант |
---|---|
Потеря цифровых подписей в документе после его загрузки и сохранения. Таким образом, обработка документа на сервере может привести к потере всех цифровых подписей без предварительного уведомления. | Проверьте, есть ли у документа цифровые подписи, и при обнаружении таковых примите соответствующие меры. Например, отправьте клиентам уведомление о том, что загружаемый ими документ содержит цифровые подписи, которые будут потеряны в случае его обработки. |
Aspose.Words поддерживает работу с макросами в документе. Но Aspose.Words пока не поддерживает цифровые подписи в макросах. | Экспортируйте документ обратно в любой формат Word и используйте Microsoft Word для добавления цифровой подписи к макросам. |
Обнаружение, подсчет и проверка цифровых подписей
Aspose.Words позволяет обнаружить цифровую подпись в документе, используя метод DetectFileFormat и свойство HasDigitalSignature. Стоит отметить, что такая проверка выявит только факт наличия подписи, но не ее достоверность.
Документ может быть подписан более одного раза, и это могут делать разные пользователи. Чтобы проверить действительность цифровых подписей, вам необходимо загрузить их из документа с помощью метода LoadSignatures и использовать свойство IsValid. Также Aspose.Words позволяет подсчитать набор всех цифровых подписей в документе, используя свойство Count.
Все это обеспечивает эффективный и безопасный способ проверки документа на наличие подписей перед его обработкой.
В следующем примере кода показано, как обнаружить наличие цифровых подписей и проверить их:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git. | |
SharedPtr<FileFormatInfo> info = FileFormatUtil::DetectFileFormat(MyDir + u"Digitally signed.docx"); | |
if (info->get_HasDigitalSignature()) | |
{ | |
std::cout << (String::Format(u"Document {0} has digital signatures, ", System::IO::Path::GetFileName(MyDir + u"Digitally signed.docx")) + | |
u"they will be lost if you open/save this document with Aspose.Words.") | |
<< std::endl; | |
} |
Создайте цифровую подпись
Чтобы создать цифровую подпись, вам потребуется загрузить сертификат подписи, подтверждающий личность. Когда вы отправляете документ с цифровой подписью, вы также отправляете свой сертификат и открытый ключ.
Aspose.Words позволяет вам создать сертификат X.509, цифровой сертификат, который использует международно признанный стандарт X.509 PKI для проверки того, что открытый ключ принадлежит лицу, подписавшему сертификат. Чтобы сделать это, используйте метод Create в классе CertificateHolder.
В следующих разделах объясняется, как добавить цифровую подпись, строку для подписи и как подписать созданный документ PDF.
Подписать документ
Aspose.Words позволяет вам подписать документ DOC, DOCX или ODT цифровым способом, используя метод Sign и свойства SignOptions.
В следующем примере кода показано, как подписывать документы с использованием владельца сертификата и параметров подписи:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git. | |
SharedPtr<CertificateHolder> certHolder = CertificateHolder::Create(MyDir + u"morzal.pfx", u"aw"); | |
DigitalSignatureUtil::Sign(MyDir + u"Digitally signed.docx", ArtifactsDir + u"Document.Signed.docx", certHolder); |
Добавьте строку подписи
Строка подписи - это визуальное представление цифровой подписи в документе. Aspose.Words позволяет вставить строку подписи, используя метод DocumentBuilder.InsertSignatureLine. Вы также можете задать параметры для этого представления, используя класс SignatureLineOptions.
Например, на рисунке ниже показано, как могут отображаться действительные и недействительные подписи.


Кроме того, если документ содержит строку для подписи и не содержит цифровой подписи, есть функция, позволяющая попросить пользователя добавить подпись.
В следующем примере кода показано, как подписать документ с помощью персонального сертификата и определенной строки подписи:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git. | |
auto doc = MakeObject<Document>(); | |
auto builder = MakeObject<DocumentBuilder>(doc); | |
auto signatureLineOptions = MakeObject<SignatureLineOptions>(); | |
signatureLineOptions->set_Signer(u"vderyushev"); | |
signatureLineOptions->set_SignerTitle(u"QA"); | |
signatureLineOptions->set_Email(u"vderyushev@aspose.com"); | |
signatureLineOptions->set_ShowDate(true); | |
signatureLineOptions->set_DefaultInstructions(false); | |
signatureLineOptions->set_Instructions(u"Please sign here."); | |
signatureLineOptions->set_AllowComments(true); | |
SharedPtr<SignatureLine> signatureLine = builder->InsertSignatureLine(signatureLineOptions)->get_SignatureLine(); | |
signatureLine->set_ProviderId(System::Guid::Parse(u"CF5A7BB4-8F3C-4756-9DF6-BEF7F13259A2")); | |
doc->Save(ArtifactsDir + u"SignDocuments.SignatureLineProviderId.docx"); | |
auto signOptions = MakeObject<SignOptions>(); | |
signOptions->set_SignatureLineId(signatureLine->get_Id()); | |
signOptions->set_ProviderId(signatureLine->get_ProviderId()); | |
signOptions->set_Comments(u"Document was signed by vderyushev"); | |
signOptions->set_SignTime(System::DateTime::get_Now()); | |
SharedPtr<CertificateHolder> certHolder = CertificateHolder::Create(MyDir + u"morzal.pfx", u"aw"); | |
DigitalSignatureUtil::Sign(ArtifactsDir + u"SignDocuments.SignatureLineProviderId.docx", | |
ArtifactsDir + u"SignDocuments.CreateNewSignatureLineAndSetProviderId.docx", certHolder, signOptions); |
Подпишите созданный PDF документ
Aspose.Words позволяет вам подписать и получить все сведения о документе PDF, используя свойства PdfDigitalSignatureDetails.
В следующем примере кода показано, как подписать сгенерированный PDF:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git. | |
auto doc = MakeObject<Document>(); | |
auto builder = MakeObject<DocumentBuilder>(doc); | |
builder->Writeln(u"Test Signed PDF."); | |
auto saveOptions = MakeObject<PdfSaveOptions>(); | |
saveOptions->set_DigitalSignatureDetails(MakeObject<PdfDigitalSignatureDetails>(CertificateHolder::Create(MyDir + u"morzal.pfx", u"aw"), u"reason", | |
u"location", System::DateTime::get_Now())); | |
doc->Save(ArtifactsDir + u"WorkingWithPdfSaveOptions.DigitallySignedPdfUsingCertificateHolder.pdf", saveOptions); |
Извлеките значение цифровой подписи
Aspose.Words также предоставляет возможность извлекать значение цифровой подписи из документа с цифровой подписью в виде массива байт, используя свойство SignatureValue.
В следующем примере кода показано, как получить значение цифровой подписи в виде массива байтов из документа:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git. | |
auto doc = MakeObject<Document>(MyDir + u"Digitally signed.docx"); | |
for (const auto& digitalSignature : doc->get_DigitalSignatures()) | |
{ | |
auto signatureValue = System::Convert::ToBase64String(digitalSignature->get_SignatureValue()); | |
ASSERT_EQ(u"K1cVLLg2kbJRAzT5WK+m++G8eEO+l7S+5ENdjMxxTXkFzGUfvwxREuJdSFj9AbDMhnGvDURv9KEhC25DDF1al8NRVR71TF3CjHVZXpYu7edQS5/yLw/k5CiFZzCp1+MmhOdYPcVO+Fm+9fKr2iNLeyYB+fgEeZHfTqTFM2WwAqo=", signatureValue); | |
} |
Удаление цифровых подписей
Aspose.Words позволяет удалить все цифровые подписи из подписанного документа, используя метод RemoveAllSignatures.
В следующем примере кода показано, как загружать и удалять цифровые подписи из документа:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git. | |
// There are two ways of using the DigitalSignatureUtil class to remove digital signatures | |
// from a signed document by saving an unsigned copy of it somewhere else in the local file system. | |
// 1 - Determine the locations of both the signed document and the unsigned copy by filename strings: | |
DigitalSignatureUtil::RemoveAllSignatures(MyDir + u"Digitally signed.docx", ArtifactsDir + u"DigitalSignatureUtil.LoadAndRemove.FromString.docx"); | |
// 2 - Determine the locations of both the signed document and the unsigned copy by file streams: | |
{ | |
SharedPtr<System::IO::Stream> streamIn = MakeObject<System::IO::FileStream>(MyDir + u"Digitally signed.docx", System::IO::FileMode::Open); | |
{ | |
SharedPtr<System::IO::Stream> streamOut = | |
MakeObject<System::IO::FileStream>(ArtifactsDir + u"DigitalSignatureUtil.LoadAndRemove.FromStream.docx", System::IO::FileMode::Create); | |
DigitalSignatureUtil::RemoveAllSignatures(streamIn, streamOut); | |
} | |
} | |
// Verify that both our output documents have no digital signatures. | |
ASSERT_EQ(0, DigitalSignatureUtil::LoadSignatures(ArtifactsDir + u"DigitalSignatureUtil.LoadAndRemove.FromString.docx")->get_Count()); | |
ASSERT_EQ(0, DigitalSignatureUtil::LoadSignatures(ArtifactsDir + u"DigitalSignatureUtil.LoadAndRemove.FromStream.docx")->get_Count()); |