МенеджерКриптографии.Без инициализации модуля криптографии

Конструкторы

Создает объект без инициализации модуля криптографии.

Синтаксис

Новый МенеджерКриптографии(<ИспользованиеИнтерактивногоРежима>)
Полное описание, параметры и ограничения

МенеджерКриптографии.Без инициализации модуля криптографии

МенеджерКриптографии (CryptoManager)

Без инициализации модуля криптографии

Доступен, начиная с версии 8.3.24.

Синтаксис:
Новый МенеджерКриптографии(<ИспользованиеИнтерактивногоРежима>)
Параметры:

<ИспользованиеИнтерактивногоРежима> (обязательный)
Определяет режим работы модуля криптографии.
Описание:

Создает объект без инициализации модуля криптографии.

Использование в версии:

Доступен, начиная с версии 8.3.24.

Методическая информация

Практические примеры

Добавить и убрать только свой публичный учебный сертификат через Ждать

Полный изолированный опыт с реальным DER: исходное отсутствие → импорт → точное присутствие → удаление найденного объекта → подтверждённое отсутствие. При ошибке не удаляем существовавший заранее сертификат и не объявляем неподтверждённую очистку успешной.

Где и как запускать

Полный клиентский модуль управляемой формы на отдельной собственной Windows-учётной записи и пустой учебной конфигурации 8.5.1.1343. Меняет только заранее отсутствовавший встроенный публичный DER в Личном; здесь не запускался, в ОС ничего не добавлялось/удалялось.

Подготовка

  1. Создайте отдельную собственную учётную запись Windows только для обучения. Используйте новую пустую конфигурацию УчебнаяКонфигурацияСинтаксиса и Windows-клиент ровно 8.5.1.1343. В рабочей базе или рабочей Windows-учётной записи этот опыт запрещён.

  2. Создайте обработку с управляемой формой: Занято — Булево, начально Ложь; ПодтверждаюОтдельныйСтенд — Булево, начально Ложь; Отчёт — Строка длиной 0, многострочное поле только для просмотра.

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

  4. Перед запуском вручную подтвердите свою отдельную учётную запись и единственного оператора: никто другой не должен добавлять или удалять этот учебный образец параллельно. ПодтверждаюОтдельныйСтенд — подтверждение оператора, не проверка личности пользователя ОС.

  5. В коде встроен публичный сертификат Syntax Guide Training Only. Он не содержит закрытого ключа, не является доверенным и не предназначен для реальной подписи. Первый вызов проверяет, что его точных DER-данных в Личном ещё нет.

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

  7. Область выбрана явно: ПерсональныеСертификаты + ДанныеПользователяОС. Платформа обращается к системному хранилищу; это не временный массив в форме. Ни ДанныеКомпьютера, ни КорневыеСертификаты не открываются.

  8. Проверьте на своём стенде наличие Microsoft Enhanced RSA and AES Cryptographic Provider с типом 24. Не используйте чужой DLL-путь и не угадывайте числовой тип. Для полного Windows-модуля разрешите режим синхронных вызовов: разбор/выгрузка публичных DER в памяти остаются синхронными и в уроке с Ждать.

  9. Код сам добавляет только свой публичный образец, проверяет его присутствие, удаляет только найденный точный образец и проверяет отсутствие. Изменение хранилища не является транзакцией базы 1С.

  10. Намерение импорта отмечается ДО вызова Добавить/НачатьДобавление: исключение не доказывает, что ОС ничего не записала. При ошибке выполняется одна ограниченная попытка отдельной очистки, только если до записи отсутствие образца было подтверждено.

  11. При нескольких точных совпадениях, несовпадении DER или ошибке очистки автоматическое удаление прекращается. Отчёт явно требует ручной проверки только своего учебного образца в Личном своего отдельного Windows-пользователя; нельзя чистить всё хранилище.

  12. Не закрывайте форму и клиент между стартом и итогом. При аварийном завершении процесса callback/обработка исключения не гарантированы: проверьте свой учебный сертификат вручную. Успех объявляется лишь после последнего чтения, которое подтвердило отсутствие.

  13. Сертификаты, подписи, ключевые контейнеры, PIN, OCSP/CRL и сетевые серверы не используются. Удаление из Личного не отзывает сертификат и не удаляет чужой закрытый ключ.

  14. Здесь уроки не запускались в 1С и сертификаты в ОС не добавлялись/удалялись. Проверены структура модулей и точные сигнатуры установленной справки. Эти проверки не подтверждают runtime-успех.

&НаКлиенте
Асинх Процедура ПроверитьУчебныйЦикл(Команда)
    Если Занято Тогда
        Возврат;
    КонецЕсли;
    Занято = Истина;
    НужнаОчистка = Ложь;
    Хранилище = Неопределено;
    Образец = Неопределено;
    Попытка
        ПроверитьОтдельныйСтенд();
        Образец = ПолучитьСвойПубличныйОбразец();
        Менеджер = Новый МенеджерКриптографии(ИспользованиеИнтерактивногоРежимаКриптографии.НеИспользовать);
        Менеджер = Ждать Менеджер.ИнициализироватьАсинх("Microsoft Enhanced RSA and AES Cryptographic Provider", "", 24, ИспользованиеИнтерактивногоРежимаКриптографии.НеИспользовать);
        Если ТипЗнч(Менеджер) <> Тип("МенеджерКриптографии") Тогда
            ВызватьИсключение "Инициализация не вернула менеджер";
        КонецЕсли;
        Хранилище = Ждать Менеджер.ПолучитьХранилищеСертификатовАсинх(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты, РасположениеХранилищаСертификатовКриптографии.ДанныеПользователяОС);
        ПроверитьСвоёХранилище(Хранилище);
        Кандидаты = Ждать Хранилище.ПолучитьВсеАсинх();
        Если НайтиТочныйСвойОбразец(Кандидаты, Образец) <> Неопределено Тогда
            ВызватьИсключение "Образец существовал заранее: импорт и удаление запрещены";
        КонецЕсли;
        НужнаОчистка = Истина;
        РезультатДобавления = Ждать Хранилище.ДобавитьАсинх(Образец);
        Если РезультатДобавления <> Неопределено Тогда
            ВызватьИсключение "Обещание добавления должно завершиться Неопределено";
        КонецЕсли;
        Кандидаты = Ждать Хранилище.ПолучитьВсеАсинх();
        СвойСертификат = НайтиТочныйСвойОбразец(Кандидаты, Образец);
        Если СвойСертификат = Неопределено Тогда
            ВызватьИсключение "Добавление не подтверждено повторным чтением";
        КонецЕсли;
        РезультатУдаления = Ждать Хранилище.УдалитьАсинх(СвойСертификат);
        Если РезультатУдаления <> Неопределено Тогда
            ВызватьИсключение "Обещание удаления должно завершиться Неопределено";
        КонецЕсли;
        Кандидаты = Ждать Хранилище.ПолучитьВсеАсинх();
        Если НайтиТочныйСвойОбразец(Кандидаты, Образец) <> Неопределено Тогда
            ВызватьИсключение "Удаление собственного образца не подтверждено";
        КонецЕсли;
        НужнаОчистка = Ложь;
        Отчёт = "Цикл подтверждён: до опыта собственного DER не было, добавление подтверждено, после удаления его снова нет. Доверие и закрытые ключи не менялись.";
    Исключение
        Отчёт = "Основной опыт не подтверждён.";
        Если НужнаОчистка Тогда
            Попытка
                Кандидаты = Ждать Хранилище.ПолучитьВсеАсинх();
                СвойСертификат = НайтиТочныйСвойОбразец(Кандидаты, Образец);
                Если СвойСертификат <> Неопределено Тогда
                    РезультатОчистки = Ждать Хранилище.УдалитьАсинх(СвойСертификат);
                    Если РезультатОчистки <> Неопределено Тогда
                        ВызватьИсключение "Очистка вернула неожиданный результат";
                    КонецЕсли;
                КонецЕсли;
                Кандидаты = Ждать Хранилище.ПолучитьВсеАсинх();
                Если НайтиТочныйСвойОбразец(Кандидаты, Образец) <> Неопределено Тогда
                    ВызватьИсключение "Отсутствие после отдельной очистки не подтверждено";
                КонецЕсли;
                НужнаОчистка = Ложь;
                Отчёт = Отчёт + " Отдельная очистка подтвердила отсутствие собственного образца.";
            Исключение
                Отчёт = Отчёт + " ОЧИСТКА НЕ ПОДТВЕРЖДЕНА. Проверьте только свой Syntax Guide Training Only в Личном своего отдельного учебного пользователя; не удаляйте чужие сертификаты.";
            КонецПопытки;
        Иначе
            Отчёт = Отчёт + " Импорт не был начат; уже существовавшие сертификаты не удалялись.";
        КонецЕсли;
    КонецПопытки;
    Занято = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьУчебнуюПлатформу()
    Система = Новый СистемнаяИнформация;
    Если Система.ТипПлатформы <> ТипПлатформы.Windows_x86
        И Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда
        ВызватьИсключение "Этот пример использует Windows CryptoAPI";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьОтдельныйСтенд()
    ПроверитьУчебнуюПлатформу();
    Если НЕ ПодтверждаюОтдельныйСтенд Тогда
        ВызватьИсключение "Сначала подтвердите свою отдельную учебную учётную запись Windows";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоёХранилище(Хранилище)
    Если ТипЗнч(Хранилище) <> Тип("ХранилищеСертификатовКриптографии") Тогда
        ВызватьИсключение "Ожидалось собственное хранилище заданной области";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ПолучитьСвойПубличныйОбразец()
    Данные = Base64Значение("MIIC+jCCAeKgAwIBAgIBVTANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpTeW50YXggR3VpZGUgVHJhaW5pbmcgT25seTAeFw0yMDAxMDEwMDAwMDBaFw0zNTEyMzEwMDAwMDBaMCUxIzAhBgNVBAMMGlN5bnRheCBHdWlkZSBUcmFpbmluZyBPbmx5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkraGtF6mSMHQWI0lIdDxzNjLTB0VHmtLUYEIxXFFJepQtyMGWZ9rfpbTglFp8wpsw+Wc09FQyDFuKsNz3cBcBBx7fTmJVuYzfrXjhDECNqEoKMEf+Qrim3WsVKA/Qr8IMnzq1qdnA1pLgaaKyscfCJkw9W1yoTlLV3PmGs6h6gP1/KXwe+zKN5r3Jl0IVk8RXTLAeyqN01lCuyzaeSYm/v2YS88LdaJ/nkdFqy5QjRXfm7EOCW7eCZlCBwW0EvGhUarZxWlq04lPs9qu3aC3/6gY/scE2vY1jeZV2VpV0lLQpU5gVdjVGI4YQmfgkb8jYtV5U7FQ1KQ6Poji/ort6wIDAQABozUwMzAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEARoo1FJJKKkaZXyFl1tlYj8K7xvryXwhb+tCaFvdXuON27YC3/YIHLUT9sCF9o76VIT8dsVMpK0Qo+VV0FIvqRcB+u6SmyJ+Y7590mzd5P1CSt8Y/4BNV2LosYxhcdVczs26PWHL5GXyBMWRxtBjNsnTeMKh4/WIMrplAr0IOJCmjIeKhv0JbQacsNqhmpe7JdgtBYC4Rrn3ajdD99HZREmyLR/iJrh6W4IGqSN0MGT0xL/mLI0GsTp9JhHDF3o8bmC1yMDlLOoAZp7M072bzfDsKFPg4ATQp/hhbtsTdS/LXrd9cLehZ7ThH6ljL8y2JbALD+6HPnT6Sv+Mg0Wq0MA==");
    Образец = Новый СертификатКриптографии(Данные);
    Если Base64Строка(Образец.Отпечаток) <> "tRDNiwoaiFssHhQqwyjWVlPLdns=" Тогда
        ВызватьИсключение "Встроенный публичный образец не совпадает с ожидаемыми DER-данными";
    КонецЕсли;
    Возврат Образец;
КонецФункции

&НаКлиенте
Функция НайтиТочныйСвойОбразец(Кандидаты, Образец)
    Если ТипЗнч(Кандидаты) <> Тип("Массив") Тогда
        ВызватьИсключение "Ожидался массив сертификатов выбранной области";
    КонецЕсли;
    СвойСертификат = Неопределено;
    Для Каждого Кандидат Из Кандидаты Цикл
        Если ТипЗнч(Кандидат) <> Тип("СертификатКриптографии") Тогда
            ВызватьИсключение "В массиве ожидался сертификат";
        КонецЕсли;
        Если Base64Строка(Кандидат.Отпечаток) <> Base64Строка(Образец.Отпечаток) Тогда
            Продолжить;
        КонецЕсли;
        ДанныеКандидата = Кандидат.Выгрузить();
        Если ТипЗнч(ДанныеКандидата) <> Тип("ДвоичныеДанные") Тогда
            ВызватьИсключение "Публичная выгрузка должна вернуть DER-байты";
        КонецЕсли;
        Если Base64Строка(ДанныеКандидата) <> "MIIC+jCCAeKgAwIBAgIBVTANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpTeW50YXggR3VpZGUgVHJhaW5pbmcgT25seTAeFw0yMDAxMDEwMDAwMDBaFw0zNTEyMzEwMDAwMDBaMCUxIzAhBgNVBAMMGlN5bnRheCBHdWlkZSBUcmFpbmluZyBPbmx5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkraGtF6mSMHQWI0lIdDxzNjLTB0VHmtLUYEIxXFFJepQtyMGWZ9rfpbTglFp8wpsw+Wc09FQyDFuKsNz3cBcBBx7fTmJVuYzfrXjhDECNqEoKMEf+Qrim3WsVKA/Qr8IMnzq1qdnA1pLgaaKyscfCJkw9W1yoTlLV3PmGs6h6gP1/KXwe+zKN5r3Jl0IVk8RXTLAeyqN01lCuyzaeSYm/v2YS88LdaJ/nkdFqy5QjRXfm7EOCW7eCZlCBwW0EvGhUarZxWlq04lPs9qu3aC3/6gY/scE2vY1jeZV2VpV0lLQpU5gVdjVGI4YQmfgkb8jYtV5U7FQ1KQ6Poji/ort6wIDAQABozUwMzAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEARoo1FJJKKkaZXyFl1tlYj8K7xvryXwhb+tCaFvdXuON27YC3/YIHLUT9sCF9o76VIT8dsVMpK0Qo+VV0FIvqRcB+u6SmyJ+Y7590mzd5P1CSt8Y/4BNV2LosYxhcdVczs26PWHL5GXyBMWRxtBjNsnTeMKh4/WIMrplAr0IOJCmjIeKhv0JbQacsNqhmpe7JdgtBYC4Rrn3ajdD99HZREmyLR/iJrh6W4IGqSN0MGT0xL/mLI0GsTp9JhHDF3o8bmC1yMDlLOoAZp7M072bzfDsKFPg4ATQp/hhbtsTdS/LXrd9cLehZ7ThH6ljL8y2JbALD+6HPnT6Sv+Mg0Wq0MA==" Тогда
            ВызватьИсключение "Совпадение отпечатка без совпадения собственного DER не разрешает удаление";
        КонецЕсли;
        Если СвойСертификат <> Неопределено Тогда
            ВызватьИсключение "Несколько точных совпадений: автоматическое удаление запрещено";
        КонецЕсли;
        СвойСертификат = Кандидат;
    КонецЦикла;
    Возврат СвойСертификат;
КонецФункции

Разбор по шагам

  1. Проверить собственную конфигурацию, Windows и подтверждение отдельного стенда; затем разобрать и проверить встроенный публичный DER.

  2. Инициализировать своего менеджера по подтверждённым имени провайдера и типу 24; получить только Личное текущего пользователя ОС.

  3. Прочитать выбранную область и подтвердить отсутствие точного DER-образца. Если он существовал заранее, остановиться без импорта и удаления.

  4. Установить НужнаОчистка до попытки импорта, а не после её успеха. Добавить только свой публичный Образец.

  5. Повторным чтением найти единственный точный публичный DER; отсутствие после добавления и несколько совпадений считать неподтверждённым результатом.

  6. Удалить найденный объект сертификата, а не строку CN/отпечатка и не случайный первый элемент массива.

  7. Новым чтением подтвердить отсутствие, только затем снять НужнаОчистка и вывести окончательный успех.

  8. При ошибке после намерения импорта один раз отдельно проверить/убрать только собственный добавленный образец. Если очистка не подтверждена, сообщить об этом прямо; не выдавать основной опыт за успешный.

  9. Один общий Попытка содержит проверки до/после изменения. В обработчике ошибки очистка находится в отдельном Попытка и не маскирует отсутствие подтверждения.

  10. НужнаОчистка выставляется после подтверждения исходного отсутствия и перед Добавить; снимается только после повторного чтения, подтвердившего отсутствие.

  11. Ждать используется внутри Асинх Процедура. Результаты ДобавитьАсинх/УдалитьАсинх сравниваются с Неопределено, не с Истина; после каждого обещания состояние хранилища читается заново.

Как проверить результат

  1. На чистом собственном стенде финальный отчёт подтверждает весь цикл только после последнего чтения. Личное не содержит учебный образец после окончания.

  2. Если образец установили заранее вручную, импорт/удаление запрещены; сертификат остаётся на месте. Это обязательный отрицательный опыт, а не повод удалить его автоматически.

  3. Отсутствие после добавления, несколько точных совпадений и неверный тип останавливают основной опыт; автоматическое удаление неоднозначных совпадений не выполняется.

  4. При ошибке очистки видно ОЧИСТКА НЕ ПОДТВЕРЖДЕНА; основной опыт не объявлен успешным. Ручная проверка относится только к своему образцу на своём стенде.

  5. Нет закрытого ключа/PIN, корневого доверия, подписи, сети и работы с хранилищем компьютера. Занято снят только после результата или окончательной ошибки.

Ожидаемый результат

Получен проверяемый полный цикл изменения только собственного публичного учебного образца в Личном своего изолированного Windows-пользователя; исходное и конечное состояния проверяются явно.

На что обратить внимание

  1. Если собственный образец был в хранилище ДО опыта, импорт и удаление не выполняются. Подход «удалить по знакомому CN» может затронуть чужой сертификат.

  2. SHA-1-отпечаток здесь идентификатор поиска, а не рекомендация алгоритма подписи. После совпадения отпечатка дополнительно сравниваются точные публичные DER-байты.

  3. У синхронных Добавить/Удалить нет результата Булево. У обещаний результат Неопределено; у callback добавления/удаления только один аргумент Состояние. Подтверждение изменения получают новым чтением.

  4. Ошибка метода добавления может оставить частичный результат. Нельзя снимать признак необходимости очистки сразу после вызова или только по отсутствию исключения удаления.

  5. Очистка собственного образца — отдельная операция с ОС, не ОтменитьТранзакцию. Автоматически убрать результат после аварийного закрытия клиента этот модуль не обещает.

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

  7. Не переносите Windows-клиентский урок в веб-/мобильный клиент: там инициализация, расширения и ограничения удаления отличаются. Мобильное ограничение удаления истёкших персональных сертификатов не является правилом этого Windows-опыта.

  8. Установка публичного самоподписанного сертификата в Личное не делает его доверенным, не создаёт закрытый ключ и не разрешает реальную подпись документов.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Добавить и убрать только свой публичный учебный сертификат через цепочку оповещений с отдельной очисткой

Полный изолированный опыт с реальным DER: исходное отсутствие → импорт → точное присутствие → удаление найденного объекта → подтверждённое отсутствие. При ошибке не удаляем существовавший заранее сертификат и не объявляем неподтверждённую очистку успешной.

Где и как запускать

Полный клиентский модуль управляемой формы на отдельной собственной Windows-учётной записи и пустой учебной конфигурации 8.5.1.1343. Меняет только заранее отсутствовавший встроенный публичный DER в Личном; здесь не запускался, в ОС ничего не добавлялось/удалялось.

Подготовка

  1. Создайте отдельную собственную учётную запись Windows только для обучения. Используйте новую пустую конфигурацию УчебнаяКонфигурацияСинтаксиса и Windows-клиент ровно 8.5.1.1343. В рабочей базе или рабочей Windows-учётной записи этот опыт запрещён.

  2. Создайте обработку с управляемой формой: Занято — Булево, начально Ложь; ПодтверждаюОтдельныйСтенд — Булево, начально Ложь; Отчёт — Строка длиной 0, многострочное поле только для просмотра.

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

  4. Перед запуском вручную подтвердите свою отдельную учётную запись и единственного оператора: никто другой не должен добавлять или удалять этот учебный образец параллельно. ПодтверждаюОтдельныйСтенд — подтверждение оператора, не проверка личности пользователя ОС.

  5. В коде встроен публичный сертификат Syntax Guide Training Only. Он не содержит закрытого ключа, не является доверенным и не предназначен для реальной подписи. Первый вызов проверяет, что его точных DER-данных в Личном ещё нет.

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

  7. Область выбрана явно: ПерсональныеСертификаты + ДанныеПользователяОС. Платформа обращается к системному хранилищу; это не временный массив в форме. Ни ДанныеКомпьютера, ни КорневыеСертификаты не открываются.

  8. Проверьте на своём стенде наличие Microsoft Enhanced RSA and AES Cryptographic Provider с типом 24. Не используйте чужой DLL-путь и не угадывайте числовой тип. Для полного Windows-модуля разрешите режим синхронных вызовов: разбор/выгрузка публичных DER в памяти остаются синхронными и в уроке с Ждать.

  9. Код сам добавляет только свой публичный образец, проверяет его присутствие, удаляет только найденный точный образец и проверяет отсутствие. Изменение хранилища не является транзакцией базы 1С.

  10. Намерение импорта отмечается ДО вызова Добавить/НачатьДобавление: исключение не доказывает, что ОС ничего не записала. При ошибке выполняется одна ограниченная попытка отдельной очистки, только если до записи отсутствие образца было подтверждено.

  11. При нескольких точных совпадениях, несовпадении DER или ошибке очистки автоматическое удаление прекращается. Отчёт явно требует ручной проверки только своего учебного образца в Личном своего отдельного Windows-пользователя; нельзя чистить всё хранилище.

  12. Не закрывайте форму и клиент между стартом и итогом. При аварийном завершении процесса callback/обработка исключения не гарантированы: проверьте свой учебный сертификат вручную. Успех объявляется лишь после последнего чтения, которое подтвердило отсутствие.

  13. Сертификаты, подписи, ключевые контейнеры, PIN, OCSP/CRL и сетевые серверы не используются. Удаление из Личного не отзывает сертификат и не удаляет чужой закрытый ключ.

  14. Здесь уроки не запускались в 1С и сертификаты в ОС не добавлялись/удалялись. Проверены структура модулей и точные сигнатуры установленной справки. Эти проверки не подтверждают runtime-успех.

&НаКлиенте
Процедура ПроверитьУчебныйЦикл(Команда)
    Если Занято Тогда
        Возврат;
    КонецЕсли;
    Занято = Истина;
    Состояние = Неопределено;
    Попытка
        ПроверитьОтдельныйСтенд();
        Образец = ПолучитьСвойПубличныйОбразец();
        Состояние = Новый Структура("Менеджер,Хранилище,Образец,НужнаОчистка,ОчисткаНачата,Этап", Неопределено, Неопределено, Образец, Ложь, Ложь, "До");
        Состояние.Менеджер = Новый МенеджерКриптографии(ИспользованиеИнтерактивногоРежимаКриптографии.НеИспользовать);
        Состояние.Менеджер.НачатьИнициализацию(ОповещениеУчебногоЦикла("ПослеИнициализацииЦикла", Состояние), "Microsoft Enhanced RSA and AES Cryptographic Provider", "", 24, ИспользованиеИнтерактивногоРежимаКриптографии.НеИспользовать);
    Исключение
        Если Состояние = Неопределено Тогда
            Занято = Ложь;
            Отчёт = "Стенд или публичный образец не подтверждены; импорт не начат";
        Иначе
            ЗавершитьНеудачныйЦикл(Состояние);
        КонецЕсли;
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Функция ОповещениеУчебногоЦикла(ИмяОбработчика, Состояние)
    Возврат Новый ОписаниеОповещения(ИмяОбработчика, ЭтотОбъект, Состояние, "ОшибкаУчебногоЦикла", ЭтотОбъект);
КонецФункции

&НаКлиенте
Процедура ПослеИнициализацииЦикла(Менеджер, Состояние) Экспорт
    Попытка
        Если ТипЗнч(Менеджер) <> Тип("МенеджерКриптографии") Тогда
            ВызватьИсключение "Ожидался инициализированный менеджер";
        КонецЕсли;
        Состояние.Менеджер = Менеджер;
        Состояние.Менеджер.НачатьПолучениеХранилищаСертификатов(ОповещениеУчебногоЦикла("ПослеХранилищаЦикла", Состояние), ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты, РасположениеХранилищаСертификатовКриптографии.ДанныеПользователяОС);
    Исключение
        ЗавершитьНеудачныйЦикл(Состояние);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеХранилищаЦикла(Хранилище, Состояние) Экспорт
    Попытка
        ПроверитьСвоёХранилище(Хранилище);
        Состояние.Хранилище = Хранилище;
        Состояние.Хранилище.НачатьПолучениеВсех(ОповещениеУчебногоЦикла("ПослеСертификатовЦикла", Состояние));
    Исключение
        ЗавершитьНеудачныйЦикл(Состояние);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеСертификатовЦикла(Кандидаты, Состояние) Экспорт
    Попытка
        СвойСертификат = НайтиТочныйСвойОбразец(Кандидаты, Состояние.Образец);
        Если Состояние.Этап = "До" Тогда
            Если СвойСертификат <> Неопределено Тогда
                ВызватьИсключение "Образец существовал заранее: импорт и удаление запрещены";
            КонецЕсли;
            Состояние.НужнаОчистка = Истина;
            Состояние.Хранилище.НачатьДобавление(ОповещениеУчебногоЦикла("ПослеДобавленияЦикла", Состояние), Состояние.Образец);
        ИначеЕсли Состояние.Этап = "ПослеДобавления" Тогда
            Если СвойСертификат = Неопределено Тогда
                ВызватьИсключение "Добавление не подтверждено повторным чтением";
            КонецЕсли;
            Состояние.Хранилище.НачатьУдаление(ОповещениеУчебногоЦикла("ПослеУдаленияЦикла", Состояние), СвойСертификат);
        ИначеЕсли Состояние.Этап = "ДляОчистки" Тогда
            Если СвойСертификат = Неопределено Тогда
                Состояние.НужнаОчистка = Ложь;
                Отчёт = "Основной опыт не подтверждён; отдельная проверка подтвердила отсутствие собственного образца.";
                Занято = Ложь;
            Иначе
                Состояние.Хранилище.НачатьУдаление(ОповещениеУчебногоЦикла("ПослеУдаленияЦикла", Состояние), СвойСертификат);
            КонецЕсли;
        ИначеЕсли Состояние.Этап = "ПослеУдаления" Или Состояние.Этап = "ПослеОчистки" Тогда
            Если СвойСертификат <> Неопределено Тогда
                ВызватьИсключение "Отсутствие после удаления не подтверждено";
            КонецЕсли;
            Состояние.НужнаОчистка = Ложь;
            Если Состояние.Этап = "ПослеОчистки" Тогда
                Отчёт = "Основной опыт не подтверждён; отдельная очистка подтвердила отсутствие собственного образца.";
            Иначе
                Отчёт = "Цикл подтверждён: своего DER до опыта не было, добавление проверено, после удаления его снова нет. Корневое доверие и ключи не менялись.";
            КонецЕсли;
            Занято = Ложь;
        Иначе
            ВызватьИсключение "Неизвестный этап собственной цепочки";
        КонецЕсли;
    Исключение
        ЗавершитьНеудачныйЦикл(Состояние);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеДобавленияЦикла(Состояние) Экспорт
    Попытка
        Состояние.Этап = "ПослеДобавления";
        Состояние.Хранилище.НачатьПолучениеВсех(ОповещениеУчебногоЦикла("ПослеСертификатовЦикла", Состояние));
    Исключение
        ЗавершитьНеудачныйЦикл(Состояние);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ПослеУдаленияЦикла(Состояние) Экспорт
    Попытка
        Если Состояние.ОчисткаНачата Тогда
            Состояние.Этап = "ПослеОчистки";
        Иначе
            Состояние.Этап = "ПослеУдаления";
        КонецЕсли;
        Состояние.Хранилище.НачатьПолучениеВсех(ОповещениеУчебногоЦикла("ПослеСертификатовЦикла", Состояние));
    Исключение
        ЗавершитьНеудачныйЦикл(Состояние);
    КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьНеудачныйЦикл(Состояние)
    Если Состояние.НужнаОчистка И НЕ Состояние.ОчисткаНачата Тогда
        Состояние.ОчисткаНачата = Истина;
        Состояние.Этап = "ДляОчистки";
        Попытка
            Состояние.Хранилище.НачатьПолучениеВсех(ОповещениеУчебногоЦикла("ПослеСертификатовЦикла", Состояние));
            Возврат;
        Исключение
            Отчёт = "ОЧИСТКА НЕ ПОДТВЕРЖДЕНА: не удалось начать отдельную проверку. Проверьте только свой Syntax Guide Training Only в Личном своего учебного пользователя; основной опыт не подтверждён.";
            Занято = Ложь;
            Возврат;
        КонецПопытки;
    КонецЕсли;
    Если Состояние.НужнаОчистка Тогда
        Отчёт = "ОЧИСТКА НЕ ПОДТВЕРЖДЕНА. Проверьте только свой Syntax Guide Training Only в Личном своего отдельного учебного пользователя; не удаляйте чужие сертификаты.";
    Иначе
        Отчёт = "Опыт не подтверждён; импорт не был начат, уже существовавшие сертификаты не удалялись.";
    КонецЕсли;
    Занято = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ОшибкаУчебногоЦикла(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
    СтандартнаяОбработка = Истина;
    ЗавершитьНеудачныйЦикл(Состояние);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьУчебнуюПлатформу()
    Система = Новый СистемнаяИнформация;
    Если Система.ТипПлатформы <> ТипПлатформы.Windows_x86
        И Система.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда
        ВызватьИсключение "Этот пример использует Windows CryptoAPI";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьОтдельныйСтенд()
    ПроверитьУчебнуюПлатформу();
    Если НЕ ПодтверждаюОтдельныйСтенд Тогда
        ВызватьИсключение "Сначала подтвердите свою отдельную учебную учётную запись Windows";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоёХранилище(Хранилище)
    Если ТипЗнч(Хранилище) <> Тип("ХранилищеСертификатовКриптографии") Тогда
        ВызватьИсключение "Ожидалось собственное хранилище заданной области";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ПолучитьСвойПубличныйОбразец()
    Данные = Base64Значение("MIIC+jCCAeKgAwIBAgIBVTANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpTeW50YXggR3VpZGUgVHJhaW5pbmcgT25seTAeFw0yMDAxMDEwMDAwMDBaFw0zNTEyMzEwMDAwMDBaMCUxIzAhBgNVBAMMGlN5bnRheCBHdWlkZSBUcmFpbmluZyBPbmx5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkraGtF6mSMHQWI0lIdDxzNjLTB0VHmtLUYEIxXFFJepQtyMGWZ9rfpbTglFp8wpsw+Wc09FQyDFuKsNz3cBcBBx7fTmJVuYzfrXjhDECNqEoKMEf+Qrim3WsVKA/Qr8IMnzq1qdnA1pLgaaKyscfCJkw9W1yoTlLV3PmGs6h6gP1/KXwe+zKN5r3Jl0IVk8RXTLAeyqN01lCuyzaeSYm/v2YS88LdaJ/nkdFqy5QjRXfm7EOCW7eCZlCBwW0EvGhUarZxWlq04lPs9qu3aC3/6gY/scE2vY1jeZV2VpV0lLQpU5gVdjVGI4YQmfgkb8jYtV5U7FQ1KQ6Poji/ort6wIDAQABozUwMzAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEARoo1FJJKKkaZXyFl1tlYj8K7xvryXwhb+tCaFvdXuON27YC3/YIHLUT9sCF9o76VIT8dsVMpK0Qo+VV0FIvqRcB+u6SmyJ+Y7590mzd5P1CSt8Y/4BNV2LosYxhcdVczs26PWHL5GXyBMWRxtBjNsnTeMKh4/WIMrplAr0IOJCmjIeKhv0JbQacsNqhmpe7JdgtBYC4Rrn3ajdD99HZREmyLR/iJrh6W4IGqSN0MGT0xL/mLI0GsTp9JhHDF3o8bmC1yMDlLOoAZp7M072bzfDsKFPg4ATQp/hhbtsTdS/LXrd9cLehZ7ThH6ljL8y2JbALD+6HPnT6Sv+Mg0Wq0MA==");
    Образец = Новый СертификатКриптографии(Данные);
    Если Base64Строка(Образец.Отпечаток) <> "tRDNiwoaiFssHhQqwyjWVlPLdns=" Тогда
        ВызватьИсключение "Встроенный публичный образец не совпадает с ожидаемыми DER-данными";
    КонецЕсли;
    Возврат Образец;
КонецФункции

&НаКлиенте
Функция НайтиТочныйСвойОбразец(Кандидаты, Образец)
    Если ТипЗнч(Кандидаты) <> Тип("Массив") Тогда
        ВызватьИсключение "Ожидался массив сертификатов выбранной области";
    КонецЕсли;
    СвойСертификат = Неопределено;
    Для Каждого Кандидат Из Кандидаты Цикл
        Если ТипЗнч(Кандидат) <> Тип("СертификатКриптографии") Тогда
            ВызватьИсключение "В массиве ожидался сертификат";
        КонецЕсли;
        Если Base64Строка(Кандидат.Отпечаток) <> Base64Строка(Образец.Отпечаток) Тогда
            Продолжить;
        КонецЕсли;
        ДанныеКандидата = Кандидат.Выгрузить();
        Если ТипЗнч(ДанныеКандидата) <> Тип("ДвоичныеДанные") Тогда
            ВызватьИсключение "Публичная выгрузка должна вернуть DER-байты";
        КонецЕсли;
        Если Base64Строка(ДанныеКандидата) <> "MIIC+jCCAeKgAwIBAgIBVTANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpTeW50YXggR3VpZGUgVHJhaW5pbmcgT25seTAeFw0yMDAxMDEwMDAwMDBaFw0zNTEyMzEwMDAwMDBaMCUxIzAhBgNVBAMMGlN5bnRheCBHdWlkZSBUcmFpbmluZyBPbmx5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkraGtF6mSMHQWI0lIdDxzNjLTB0VHmtLUYEIxXFFJepQtyMGWZ9rfpbTglFp8wpsw+Wc09FQyDFuKsNz3cBcBBx7fTmJVuYzfrXjhDECNqEoKMEf+Qrim3WsVKA/Qr8IMnzq1qdnA1pLgaaKyscfCJkw9W1yoTlLV3PmGs6h6gP1/KXwe+zKN5r3Jl0IVk8RXTLAeyqN01lCuyzaeSYm/v2YS88LdaJ/nkdFqy5QjRXfm7EOCW7eCZlCBwW0EvGhUarZxWlq04lPs9qu3aC3/6gY/scE2vY1jeZV2VpV0lLQpU5gVdjVGI4YQmfgkb8jYtV5U7FQ1KQ6Poji/ort6wIDAQABozUwMzAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEARoo1FJJKKkaZXyFl1tlYj8K7xvryXwhb+tCaFvdXuON27YC3/YIHLUT9sCF9o76VIT8dsVMpK0Qo+VV0FIvqRcB+u6SmyJ+Y7590mzd5P1CSt8Y/4BNV2LosYxhcdVczs26PWHL5GXyBMWRxtBjNsnTeMKh4/WIMrplAr0IOJCmjIeKhv0JbQacsNqhmpe7JdgtBYC4Rrn3ajdD99HZREmyLR/iJrh6W4IGqSN0MGT0xL/mLI0GsTp9JhHDF3o8bmC1yMDlLOoAZp7M072bzfDsKFPg4ATQp/hhbtsTdS/LXrd9cLehZ7ThH6ljL8y2JbALD+6HPnT6Sv+Mg0Wq0MA==" Тогда
            ВызватьИсключение "Совпадение отпечатка без совпадения собственного DER не разрешает удаление";
        КонецЕсли;
        Если СвойСертификат <> Неопределено Тогда
            ВызватьИсключение "Несколько точных совпадений: автоматическое удаление запрещено";
        КонецЕсли;
        СвойСертификат = Кандидат;
    КонецЦикла;
    Возврат СвойСертификат;
КонецФункции

Разбор по шагам

  1. Проверить собственную конфигурацию, Windows и подтверждение отдельного стенда; затем разобрать и проверить встроенный публичный DER.

  2. Инициализировать своего менеджера по подтверждённым имени провайдера и типу 24; получить только Личное текущего пользователя ОС.

  3. Прочитать выбранную область и подтвердить отсутствие точного DER-образца. Если он существовал заранее, остановиться без импорта и удаления.

  4. Установить НужнаОчистка до попытки импорта, а не после её успеха. Добавить только свой публичный Образец.

  5. Повторным чтением найти единственный точный публичный DER; отсутствие после добавления и несколько совпадений считать неподтверждённым результатом.

  6. Удалить найденный объект сертификата, а не строку CN/отпечатка и не случайный первый элемент массива.

  7. Новым чтением подтвердить отсутствие, только затем снять НужнаОчистка и вывести окончательный успех.

  8. При ошибке после намерения импорта один раз отдельно проверить/убрать только собственный добавленный образец. Если очистка не подтверждена, сообщить об этом прямо; не выдавать основной опыт за успешный.

  9. Инициализация возвращает менеджер, получение хранилища — хранилище, получение всех — массив и Состояние. Добавление и удаление вызывают экспортный обработчик только с одним аргументом Состояние.

  10. Этап До разрешает импорт лишь после отсутствия; ПослеДобавления разрешает удаление лишь после точного присутствия; ПослеУдаления разрешает успех лишь после отсутствия.

  11. При ошибке выставить ОчисткаНачата до её старта. Этапы ДляОчистки/ПослеОчистки дают одну попытку, не рекурсивный бесконечный повтор. Занято удерживается до последнего результата.

Как проверить результат

  1. На чистом собственном стенде финальный отчёт подтверждает весь цикл только после последнего чтения. Личное не содержит учебный образец после окончания.

  2. Если образец установили заранее вручную, импорт/удаление запрещены; сертификат остаётся на месте. Это обязательный отрицательный опыт, а не повод удалить его автоматически.

  3. Отсутствие после добавления, несколько точных совпадений и неверный тип останавливают основной опыт; автоматическое удаление неоднозначных совпадений не выполняется.

  4. При ошибке очистки видно ОЧИСТКА НЕ ПОДТВЕРЖДЕНА; основной опыт не объявлен успешным. Ручная проверка относится только к своему образцу на своём стенде.

  5. Нет закрытого ключа/PIN, корневого доверия, подписи, сети и работы с хранилищем компьютера. Занято снят только после результата или окончательной ошибки.

Ожидаемый результат

Получен проверяемый полный цикл изменения только собственного публичного учебного образца в Личном своего изолированного Windows-пользователя; исходное и конечное состояния проверяются явно.

На что обратить внимание

  1. Если собственный образец был в хранилище ДО опыта, импорт и удаление не выполняются. Подход «удалить по знакомому CN» может затронуть чужой сертификат.

  2. SHA-1-отпечаток здесь идентификатор поиска, а не рекомендация алгоритма подписи. После совпадения отпечатка дополнительно сравниваются точные публичные DER-байты.

  3. У синхронных Добавить/Удалить нет результата Булево. У обещаний результат Неопределено; у callback добавления/удаления только один аргумент Состояние. Подтверждение изменения получают новым чтением.

  4. Ошибка метода добавления может оставить частичный результат. Нельзя снимать признак необходимости очистки сразу после вызова или только по отсутствию исключения удаления.

  5. Очистка собственного образца — отдельная операция с ОС, не ОтменитьТранзакцию. Автоматически убрать результат после аварийного закрытия клиента этот модуль не обещает.

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

  7. Не переносите Windows-клиентский урок в веб-/мобильный клиент: там инициализация, расширения и ограничения удаления отличаются. Мобильное ограничение удаления истёкших персональных сертификатов не является правилом этого Windows-опыта.

  8. Установка публичного самоподписанного сертификата в Личное не делает его доверенным, не создаёт закрытый ключ и не разрешает реальную подпись документов.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.