Мы рады объявить о выпуске GroupDocs.Signature for .NET v26.9, доступном с сентября 2026 года. Это обновление, ориентированное на безопасность, вводит поддержку .NET 10, прекращает поддержку .NET Standard 2.1 и усиливает строгие значения по умолчанию для загрузки внешних ресурсов, алгоритмов хеширования и проверки сертификатов. Также добавлена поддержка подписи Word‑документов постквантовыми (ML‑DSA) сертификатами и исправлены несколько критических ошибок, связанных с проверкой, журналированием и поведением на разных платформах.
Что нового в этом выпуске
- [Feature] Поддержка .NET 10 и прекращение поддержки .NET Standard 2.1 (SIGNATURENET-5938)
- [Enhancement] Внешние ресурсы больше не загружаются по умолчанию (SIGNATURENET-5950)
- [Enhancement] Цифровые подписи PDF используют SHA‑256 по умолчанию и учитывают HashAlgorithm (SIGNATURENET-5976)
- [Enhancement] SignatureFont больше не раскрывает типы System.Drawing в .NET 6 и новее (SIGNATURENET-5943)
- [Enhancement] Подпись с истёкшим или ещё недействительным сертификатом отклоняется по умолчанию (SIGNATURENET-5995)
- [Enhancement] Подпись Word‑документов постквантовыми (ML‑DSA) сертификатами (SIGNATURENET-5996)
- [Bug] Verify не проверял цифровые подписи PDF криптографически (SIGNATURENET-5978)
- [Bug] При проверке PDF‑документов игнорировались SubjectName и IssuerName (SIGNATURENET-5997)
- [Bug] Учётные данные сервера штампов времени отправлялись только при указании и имени пользователя, и пароля (SIGNATURENET-5998)
- [Bug] Сохранение презентаций и Word‑документов как изображений не работало в Linux и macOS (SIGNATURENET-5999)
- [Bug] LoadExternalResources игнорировался для документов внутри архивов (SIGNATURENET-6000)
- [Bug] Внешние изображения и таблицы стилей SVG‑изображений всегда загружались (SIGNATURENET-6001)
- [Bug] Поиск и проверка таблицы с привязанным изображением вызывали ArgumentNullException (SIGNATURENET-6002)
- [Bug] CertificateVerifyOptions.Expired учитывал неверный локальный смещение UTC (SIGNATURENET-6003)
- [Bug] SignatureSettings.LogLevel не оказывал влияния (SIGNATURENET-6004)
- [Bug] При повторном использовании VerifyOptions возвращались подписи документов, проверенных ранее (SIGNATURENET-6005)
- [Bug] При повторном использовании DigitalSignOptions последующие презентации подписывались первым сертификатом и комментарием (SIGNATURENET-6006)
- [Enhancement] Внутренние улучшения (SIGNATURENET-5979)
Изменения публичного API
| Член | Изменение |
|---|---|
LoadOptions.SkipExternalResources |
Новое. bool, значение по умолчанию true. При true внешние ресурсы не загружаются, за исключением тех, которые совпадают с WhitelistedResources. |
LoadOptions.WhitelistedResources |
Новое. List<string>, по умолчанию пустой. Части адресов, которые могут быть загружены, пока SkipExternalResources равно true. Адрес загружается, если содержит одну из этих частей, без учёта регистра. Установка null очищает список. |
LoadOptions.LoadExternalResources |
Устарело. Всё ещё работает, но имеет противоположный смысл SkipExternalResources. Значение по умолчанию изменилось с true на false. Использование вызывает предупреждение компилятора CS0618. |
SignatureFont неявное преобразование из System.Drawing.Font |
Удалено в сборках .NET 6, .NET 8 и .NET 10. Устарело в сборке .NET Framework. Вместо этого задавайте свойства SignatureFont. |
SignOptions.HashAlgorithm |
Сигнатура не изменилась. Теперь учитывается для цифровых подписей PDF; ранее игнорировался. |
DigitalVerifyOptions.SubjectName, DigitalVerifyOptions.IssuerName |
Сигнатура не изменилась. Теперь учитываются для PDF‑документов; ранее игнорировались. |
SignatureSettings.LogLevel |
Сигнатура не изменилась. Теперь действует: только сообщения уровней, указанных в LogLevel, попадают в журнал, а LogLevel.None ничего не логирует. Раньше логировалось каждое сообщение независимо от значения. Описания значений LogLevel исправлены. |
VerificationResult.Succeeded, VerificationResult.TotalSignatures |
Сигнатура не изменилась. При использовании одного объекта VerifyOptions для нескольких вызовов Verify теперь отображаются только подписи только что проверенного документа. |
DigitalSignOptions.AllowExpired |
Новое. bool, значение по умолчанию false. При false попытка подписать документ сертификатом, срок действия которого истёк, бросает GroupDocsSignatureException. При true документ подписывается, и в журнал выводится предупреждение. |
DigitalSignOptions.AllowNotYetValid |
Новое. bool, значение по умолчанию false. То же самое, но для сертификата, срок действия которого ещё не начался. |
Новые возможности
Никаких новых возможностей, кроме перечисленных в разделах Что нового в этом выпуске и Изменения публичного API.
Пример кода
Разрешить только доверенные внешние ресурсы:
LoadOptions loadOptions = new LoadOptions
{
WhitelistedResources = new List<string> { "https://cdn.example.com/images/" }
};
using (Signature signature = new Signature("sample.docx", loadOptions))
{
// Only images from https://cdn.example.com/images/ are loaded.
}
Подписать с SHA‑384 и использовать истёкший сертификат (с предупреждением):
using (Signature signature = new Signature("sample.pdf"))
{
DigitalSignOptions options = new DigitalSignOptions("certificate.pfx")
{
Password = "1234567890",
HashAlgorithm = HashAlgorithm.Sha384 // honoured from this release; the default is SHA-256
};
signature.Sign("signed.pdf", options);
}
Подписать с явно разрешённым истёкшим сертификатом:
SignatureSettings settings = new SignatureSettings(new ConsoleLogger());
using (Signature signature = new Signature("sample.pdf", settings))
{
DigitalSignOptions options = new DigitalSignOptions("certificate.pfx")
{
Password = "1234567890",
AllowExpired = true
};
signature.Sign("signed.pdf", options);
// If certificate.pfx has expired, the document is signed and the console shows a warning such as:
// The signing certificate expired on 2019-05-01 12:00 UTC (subject "CN=...", thumbprint ...).
}
Подписать Word‑документ постквантовым сертификатом ML‑DSA:
using (Signature signature = new Signature("sample.docx"))
{
DigitalSignOptions options = new DigitalSignOptions("ml-dsa-65.pfx")
{
Password = "1234567890"
};
signature.Sign("signed.docx", options);
}
Настроить журналирование так, чтобы отображались только ошибки и предупреждения:
SignatureSettings settings = new SignatureSettings(new ConsoleLogger())
{
// Errors and warnings, without the step-by-step traces.
LogLevel = LogLevel.Error | LogLevel.Warning
};
Как получить обновление
NuGet
Обновите пакет GroupDocs.Signature до последней версии через NuGet: GroupDocs.Signature 26.9.0
Команда установки:
dotnet add package GroupDocs.Signature --version 26.9.0
Прямое скачивание
Скачайте сборки со страницы GroupDocs.Signature for .NET 26.9