Работа с цифровыми подписями

Цифровая подпись используется для проверки подлинности документа, чтобы установить, что отправитель документа является тем, за кого себя выдает, и содержание документа не было изменено.

Aspose.Words поддерживает документы с цифровыми подписями и предоставляет к ним доступ, позволяющий обнаруживать и проверять цифровые подписи в документе и подписывать сгенерированный документ PDF с помощью предоставленного сертификата. В настоящее время цифровые подписи поддерживаются в документах DOC, OOXML и ODT. Поддерживается подписание сгенерированных документов в формате PDF.

Цифровые подписи не сохраняются при открытии и сохранении

Важно отметить, что при загрузке и последующем сохранении документа с использованием Aspose.Words все цифровые подписи, подписанные на документе, будут утеряны. Это сделано специально, поскольку цифровая подпись гарантирует, что содержимое не было изменено, и, кроме того, подтверждает подлинность подписи того, кто подписал документ. Эти принципы были бы признаны недействительными, если бы первоначальные подписи были перенесены в итоговый документ.

В связи с этим, если вы обрабатываете документы, загруженные на сервер, это может означать, что вы можете повредить документ, загруженный на ваш сервер таким образом, не зная об этом. Поэтому лучше всего проверить наличие цифровых подписей в документе и предпринять соответствующие действия, если таковые будут обнаружены, например, клиенту может быть отправлено оповещение, информирующее его о том, что передаваемый им документ содержит цифровые подписи, которые будут потеряны при его обработке. Вы можете загрузить файл шаблона этого примера с здесь.

В приведенном выше коде используется метод FileFormatUtil.detect_file_format для определения наличия цифровых подписей в документе без предварительной загрузки документа. Это обеспечивает эффективный и безопасный способ проверки документа на наличие подписей перед их обработкой. При выполнении метод возвращает объект FileFormatInfo, который предоставляет свойство FileFormatInfo.has_digital_signature. Это свойство возвращает значение true, если документ содержит одну или несколько цифровых подписей. Важно отметить, что этот метод не проверяет подписи, он только определяет, присутствуют ли подписи. Проверка цифровых подписей рассматривается в следующем разделе.

Цифровые подписи в макросах (VBA Проектов)

К цифровым подписям в макросах невозможно получить доступ или подписать их. Это связано с тем, что Aspose.Words не имеет прямого отношения к макросам в документе. Однако цифровые подписи в макросах сохраняются при обратном экспорте документа в любой формат word. Эти подписи могут быть сохранены в коде VBA, поскольку двоичное содержимое макросов не изменяется, даже если изменяется сам документ.

Доступ к цифровым подписям и их проверка

Документ может иметь несколько цифровых подписей. Доступ ко всем этим подписям можно получить через коллекцию Document.digital_signatures. Каждый возвращаемый объект представляет собой DigitalSignature, который представляет одну цифровую подпись, принадлежащую документу. Это предоставляет элементы, которые позволяют вам проверить действительность подписи.

Наиболее важным свойством для проверки с помощью цифровых подписей является достоверность каждой подписи в документе. Все подписи в документе можно проверить сразу, вызвав свойство DigitalSignatureCollection.is_valid. Это вернет значение true, если все подписи в документе действительны или если в документе нет подписей, и значение false, если хотя бы одна цифровая подпись недействительна.

Каждую подпись также можно проверить по отдельности, вызвав команду DigitalSignature.is_valid. Подпись может оказаться недействительной по нескольким причинам, например, в документе произошли изменения с момента подписания или истек срок действия сертификата. Кроме того, можно получить доступ к дополнительным сведениям о подписи. В приведенном ниже примере кода показано, как проверить каждую подпись в документе и отобразить основную информацию о подписи. Вы можете скачать файл шаблона для этого примера с здесь.

Подписание документов Word

DigitalSignatureUtil класс предоставляет методы для подписания документа. DigitalSignatureUtil.sign метод подписывает исходный документ, используя заданную CertificateHolder цифровую подпись, и записывает подписанный документ в целевой поток.

В приведенном ниже примере показано, как подписать простой документ.

В приведенном ниже примере показано, как подписать зашифрованный документ.

Подписание документа Word строкой подписи

Вы можете подписать исходный документ, используя заданные CertificateHolder и SignOptions цифровой подписью, и записать подписанный документ в целевой файл. Используя класс SignOptions, вы можете указать параметры подписи документа. В приведенном ниже примере показано, как создать новую строку подписи и подписать документ.

В приведенном ниже примере показано, как изменить существующую строку подписи и подписать документ.

Подписание документа Word с использованием идентификатора поставщика подписи

В приведенном ниже примере показано, как подписать документ Word, используя идентификатор поставщика подписи. Поставщик криптографических услуг (CSP) - это независимый программный модуль, который фактически выполняет криптографические алгоритмы для аутентификации, кодирования и зашифровывания. MS Office резервирует значение {00000000-0000-0000-0000-0000-000000000000} для своего поставщика подписи по умолчанию.

Создайте новую строку подписи, подпишите документ Word, используя идентификатор поставщика

В приведенном ниже примере показано, как создать строку подписи и подписать документ Word, используя идентификатор поставщика подписи.

Извлеките значение цифровой подписи

Aspose.Words также предоставляет возможность извлекать значение цифровой подписи из документа с цифровой подписью в виде массива байт, используя свойство SignatureValue.

В следующем примере кода показано, как получить значение цифровой подписи в виде массива байтов из документа:

doc = aw.Document(MY_DIR + "Digitally signed.docx")

for digital_signature in doc.digital_signatures:
    signature_value = base64.b64encode(digital_signature.signature_value)
    print(f"Base64 signature value is: {signature_value}")