Параметр ControlKeyTimeValidity 0: как отключить контроль срока ключа в КриптоПро

Разбираем параметр ControlKeyTimeValidity в КриптоПро CSP: значения 0, 1, 2, где находится в реестре, как изменить, когда это помогает, а когда нет. Практические советы и ответы на вопросы.

Что такое ControlKeyTimeValidity и зачем он нужен

Параметр ControlKeyTimeValidity появился в КриптоПро CSP начиная с версии 4.0 и предназначен для управления поведением криптопровайдера при работе с ключами, срок действия которых истёк. В ранних версиях (например, 3.x) такого ограничения не было, поэтому владельцы сертификатов могли использовать ключи даже после окончания их формального срока действия. Начиная с четвёртой версии, разработчики ввели жёсткий контроль, чтобы повысить безопасность и соответствовать требованиям регуляторов.

Суть проблемы в том, что сертификат электронной подписи может быть действителен, например, до 28 сентября, а закрытый ключ, сгенерированный за несколько дней до выпуска сертификата, заканчивается уже 26 сентября. Это приводит к ситуации, когда сертификат формально ещё работает, но подписать документ невозможно — появляется ошибка 0x80090010 «Отказано в доступе». Параметр ControlKeyTimeValidity как раз управляет тем, разрешено ли использовать такой ключ для различных операций.

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

Значения параметра: 0, 1 и 2 — что они означают

Параметр ControlKeyTimeValidity может принимать три значения, каждое из которых определяет набор разрешённых операций для ключа с истёкшим сроком действия.

Значение 0 — все операции разрешены. Это означает, что даже если срок действия закрытого ключа формально истёк, вы можете использовать его для формирования электронной подписи, шифрования и расшифрования данных. Именно это значение чаще всего рекомендуют устанавливать, когда нужно срочно подписать документ, а перевыпустить ключ нет возможности.

Значение 1 — запрещено формирование электронной подписи и зашифрование, но разрешено расшифрование ранее зашифрованных сообщений. Это значение установлено по умолчанию в КриптоПро CSP 4.0. Оно позволяет читать старые зашифрованные данные, но не даёт создавать новые подписи.

Значение 2 — все операции запрещены. Ключ полностью блокируется, и любая попытка его использования приведёт к ошибке. Это самый строгий режим, который обычно включается в организациях с высокими требованиями к безопасности.

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

Где находится параметр в реестре Windows

Расположение параметра ControlKeyTimeValidity зависит от разрядности операционной системы и версии КриптоПро CSP.

Для 32-битных операционных систем путь выглядит так: HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Cryptography\CurrentVersion\Parameters\ControlKeyTimeValidity

Для 64-битных систем используется ветка WOW6432Node: HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Crypto Pro\Cryptography\CurrentVersion\Parameters\ControlKeyTimeValidity

Однако в некоторых версиях КриптоПро (например, 4.0.9708) параметр может отсутствовать, и вместо него используются отдельные ключи для разных алгоритмов:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Crypto-Pro\CSP\ControlKeyTimeValidity2001
  • HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Crypto-Pro\CSP\ControlKeyTimeValidity2012

В более новых версиях (начиная с 4.0.9758) снова используется единый параметр ControlKeyTimeValidity. Если вы не находите его в реестре, это не значит, что он отсутствует — просто он может быть не создан, и тогда применяется значение по умолчанию (1). Чтобы изменить поведение, нужно создать параметр вручную с типом DWORD и нужным значением.

Для операционных систем семейства Linux и других *nix-подобных ОС настройка выполняется через утилиту cpconfig: ./cpconfig -ini '\config\parameters' -add long ControlKeyTimeValidity <значение>

Как изменить значение параметра: пошаговая инструкция

Чтобы установить параметр ControlKeyTimeValidity в значение 0, выполните следующие шаги.

  1. Откройте редактор реестра: нажмите Win+R, введите regedit и нажмите Enter.
  2. Перейдите по одному из путей в зависимости от разрядности вашей ОС (см. предыдущий раздел). Если ветки Parameters не существует, создайте её: правый клик по разделу CurrentVersion → Создать → Раздел, назовите его Parameters.
  3. Внутри раздела Parameters создайте параметр DWORD (32 бита) с именем ControlKeyTimeValidity. Для этого правый клик по свободному месту → Создать → Параметр DWORD (32 бита).
  4. Дважды кликните по созданному параметру, установите значение 0 в поле «Значение» и нажмите ОК.
  5. Перезагрузите компьютер или перезапустите службы КриптоПро, чтобы изменения вступили в силу.

После этого проверьте, что параметр применился. Можно использовать команду csptest с соответствующими опциями, чтобы убедиться, что контроль срока действия отключён. Например, для контейнера на реестре: csptest -noerrorwait -notime -oid -get_param ct:1.2.643.2.2.37.3.11 -set_param 03020600 -container "\\.\REGISTRY\TEST" -provtype 75 -provider "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider"

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

Когда установка 0 помогает, а когда нет

Установка параметра ControlKeyTimeValidity в 0 помогает в ситуациях, когда срок действия закрытого ключа истёк, но сам сертификат ещё действителен, и вам нужно срочно подписать документ. Например, на электронных торговых площадках (ЕИС, Сбербанк-АСТ, РТС-тендер) часто возникает ошибка 0x80090010, и установка 0 позволяет завершить подписание.

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

Также не стоит рассчитывать на параметр 0, если ключ был сгенерирован с ограничением «неизвлекаемый» и хранится на защищённом носителе (токен, HSM). Для таких ключей действуют особые правила: срок действия не может превышать 3 года, и изменить это через реестр невозможно.

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

Особенности контроля сроков действия долговременных ключей

В КриптоПро CSP 4.0 реализован механизм контроля сроков действия долговременных ключей. При создании ключа срок его действия определяется автоматически: для неэкспортируемых ключей, хранящихся на функциональных ключевых носителях (ФКН) или в КриптоПро HSM, он составляет 3 года, для всех остальных — 15 месяцев.

Срок действия ключа записывается в расширение контейнера. Если в контейнере есть сертификат, то срок может определяться по полю PrivateKeyUsagePeriod, если оно присутствует. Если такого поля нет, то срок отсчитывается от даты начала действия сертификата: 3 года для ФКН/HSM и 15 месяцев для остальных.

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

Для более гибкой настройки существует расширение PrivateKeyTimeValidityControlMode с OID 1.2.643.2.2.37.3.11. Оно позволяет указать, какой источник использовать для контроля: только сертификат, только контейнер или оба. Установить это расширение можно с помощью утилиты csptest, как показано в предыдущих разделах.

Практические примеры: ошибка 0x80090010 и её решение

Рассмотрим типичную ситуацию: пользователь пытается подписать документ на портале zakupki.gov, но получает ошибку 0x80090010 «Отказано в доступе». При этом сертификат ещё действителен, но срок действия закрытого ключа уже истёк. В этом случае установка параметра ControlKeyTimeValidity в 0 часто решает проблему.

Другой пример — работа с СУФД (система удалённого финансового документооборота) через Континент-АП. Там аналогичная ошибка возникает при попытке подписать отчёт. После изменения параметра реестра подпись начинает работать.

Однако бывают случаи, когда параметр 0 не помогает. Например, если ключ был сгенерирован в КриптоПро 3.x и импортирован в 4.0, срок его действия может быть определён как 15 месяцев с момента импорта. Если этот срок уже прошёл, то даже параметр 0 не разрешит использование, так как проверка идёт по расширению контейнера.

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

Альтернативные способы решения проблемы с истёкшим ключом

Помимо изменения параметра ControlKeyTimeValidity, существуют и другие способы решения проблемы с истёкшим сроком действия закрытого ключа.

Экспорт и импорт через PFX. Как уже упоминалось, этот метод позволяет «обновить» срок действия ключа. Для этого нужно в КриптоПро открыть вкладку «Сервис», выбрать «Просмотреть сертификаты в контейнере», затем экспортировать сертификат вместе с закрытым ключом в файл PFX, а затем импортировать его обратно. При импорте будет создан новый контейнер с новым сроком действия.

Удаление расширения контейнера. Если в контейнере есть расширение, которое жёстко задаёт срок действия, его можно удалить с помощью утилиты csptest: csptest -keyset -container "Имя контейнера" -cleanext 1.2.643.2.2.37.3.10

Переустановка КриптоПро. В некоторых случаях помогает полная переустановка криптопровайдера с предварительным удалением через утилиту cspclean. Это может сбросить некорректные настройки реестра.

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

Безопасность и риски при отключении контроля

Установка параметра ControlKeyTimeValidity в 0 отключает контроль срока действия ключа, что может привести к использованию ключей, которые уже должны быть выведены из оборота. Это создаёт потенциальные риски для безопасности, так как просроченные ключи могут быть скомпрометированы или не соответствовать требованиям регуляторов.

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

Рекомендуется использовать параметр 0 только как временную меру для решения срочных задач, а затем в кратчайшие сроки перевыпустить ключи. Также важно помнить, что при включённом режиме усиленного контроля использования ключей значение ControlKeyTimeValidity игнорируется и принудительно устанавливается равным 2. Это значит, что в некоторых конфигурациях отключить контроль вообще невозможно.

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

Частые вопросы и ответы

Вопрос: Можно ли установить ControlKeyTimeValidity в 0 на постоянной основе?

Технически да, но это не рекомендуется. Параметр 0 отключает контроль срока действия, что может привести к использованию просроченных ключей. Это создаёт риски безопасности и может вызвать проблемы при проверках. Лучше использовать его как временное решение, а затем перевыпустить ключи.

Вопрос: Почему после установки 0 ошибка 0x80090010 не исчезла?

Возможно, срок действия ключа истёк давно, и в контейнере записано расширение PrivateKeyUsagePeriod, которое блокирует использование независимо от параметра. Также проверьте, что вы изменили параметр в правильной ветке реестра (для 64-битной ОС — WOW6432Node). Если проблема не решена, попробуйте экспорт/импорт через PFX.

Вопрос: Как узнать срок действия закрытого ключа?

В КриптоПро откройте вкладку «Сервис», нажмите «Протестировать», выберите контейнер и введите пароль. В окне тестирования будет показана дата окончания срока действия ключа. Также можно использовать команду csptest с параметрами для получения информации о контейнере.

Вопрос: Влияет ли параметр на работу с токенами (JaCarta, Рутокен)?

Да, влияет. Для ключей на токенах также действует контроль срока действия. Однако для неэкспортируемых ключей на ФКН срок действия ограничен 3 годами, и изменить это через реестр нельзя. Если ключ на токене истёк, потребуется перевыпуск.

Вопрос: Что делать, если параметра ControlKeyTimeValidity нет в реестре?

Создайте его вручную. Для этого перейдите в нужную ветку реестра, создайте параметр DWORD с именем ControlKeyTimeValidity и установите значение 0. Если у вас старая версия КриптоПро (до 4.0.9758), возможно, нужно использовать отдельные параметры ControlKeyTimeValidity2001 и ControlKeyTimeValidity2012 в разделе Policies.

Вопросы и ответы

Что означает параметр ControlKeyTimeValidity 0 в КриптоПро?

Параметр ControlKeyTimeValidity 0 разрешает все операции с ключом, даже если его срок действия истёк. Это позволяет формировать электронную подпись и шифровать данные, несмотря на формальное окончание срока ключа. Значение 1 (по умолчанию) запрещает подпись и шифрование, но разрешает расшифрование, а значение 2 запрещает все операции.

Где находится параметр ControlKeyTimeValidity в реестре Windows?

Для 32-битных систем: HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Cryptography\CurrentVersion\Parameters\ControlKeyTimeValidity. Для 64-битных: HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Crypto Pro\Cryptography\CurrentVersion\Parameters\ControlKeyTimeValidity. В некоторых версиях параметр может отсутствовать, и его нужно создать вручную с типом DWORD.

Помогает ли установка ControlKeyTimeValidity 0 при ошибке 0x80090010?

Да, в большинстве случаев установка значения 0 решает проблему ошибки 0x80090010 «Отказано в доступе», которая возникает при истечении срока действия закрытого ключа. Однако если в контейнере есть расширение PrivateKeyUsagePeriod, параметр может не помочь, и потребуется экспорт/импорт ключа через PFX.

Как изменить ControlKeyTimeValidity на 0?

Откройте редактор реестра (regedit), перейдите по нужному пути, создайте параметр DWORD с именем ControlKeyTimeValidity (если его нет) и установите значение 0. После этого перезагрузите компьютер или перезапустите службы КриптоПро. Для Linux используйте команду cpconfig.

Безопасно ли отключать контроль срока действия ключа?

Отключение контроля снижает безопасность, так как позволяет использовать просроченные ключи. Это может быть недопустимо в организациях со строгими политиками безопасности. Рекомендуется использовать параметр 0 только как временное решение, а затем перевыпустить ключи.

Что делать, если параметр ControlKeyTimeValidity не помогает?

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