Мы рады объявить о выпуске 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

Ресурсы