Найти строку учебного субъекта цепочкой оповещений

Учебные задачи

Поиск субъекта означает вхождение строки в данные субъекта. Он может вернуть посторонние совпадения; CN без точного отпечатка не принимается как собственный сертификат. Полный модуль читает только выбранную область и показывает исключительно наш публичный учебный образец.

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

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

Подготовка

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

  2. Для опыта с системным хранилищем войдите в отдельную собственную учебную учётную запись Windows без рабочих сертификатов. Хранилище не принадлежит базе 1С: оно принадлежит текущему пользователю ОС.

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

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

  5. Перед запуском вручную убедитесь, что вошли именно в свой отдельный Windows-стенд, затем отметьте ПодтверждаюОтдельныйСтенд. Флажок — подтверждение оператора, а не автоматическая проверка личности Windows-пользователя.

  6. В код встроен публичный DER-сертификат Syntax Guide Training Only. Закрытого ключа в нём нет; он не доверенный и не был установлен при подготовке этих уроков.

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

  8. Для положительного опыта администратор вашего отдельного стенда может заранее вручную разместить только этот публичный CER-образец в Личное текущей учебной учётной записи. Не помещайте его в Доверенные корневые и не используйте рабочий PFX. Эти примеры не выполняют импорт.

  9. Microsoft Enhanced RSA and AES Cryptographic Provider и числовой тип 24 подтверждены в установленной Windows-регистрации. Если он отсутствует на своём стенде, остановитесь; нельзя угадывать имя, тип или путь библиотеки.

  10. Открывается только ПерсональныеСертификаты + ДанныеПользователяОС. Это не хранилище локального компьютера, не корневое и не мобильное ДанныеПриложения. Другие области не открываются автоматически при пустом результате.

  11. Субъект и издатель в поиске сопоставляются по содержащейся строке, поэтому окончательная принадлежность образцу проверяется по точному отпечатку DER. Название CN само по себе недостаточно.

  12. Весь отчёт остаётся в форме. Нет подписи, PIN, закрытого ключа, файла, HTTP, OCSP/CRL, установки расширения, Добавить/Удалить или изменения доверия ОС.

  13. Синхронный вариант требует разрешённого режима синхронных вызовов. В варианте Ждать весь обработчик Асинх; в callback-цепочке результат возникает только после трёх этапов.

  14. При подготовке хранилище не открывалось и код в 1С не запускался. Сигнатуры и возвращаемые типы сверены с установленной справкой; runtime-проверка и доверие сертификату этим не подтверждаются.

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

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

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

&НаКлиенте
Процедура ПослеПолученияСвоегоХранилища(Хранилище, Состояние) Экспорт
    Попытка
        ПроверитьСвоёХранилище(Хранилище);
        Состояние.Хранилище = Хранилище;
        Состояние.Хранилище.НачатьПоискПоСубъекту(УчебноеОповещение("ПослеСвоегоПоиска", Состояние), "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-данными";
    КонецЕсли;
    Возврат Образец;
КонецФункции

&НаКлиенте
Функция СформироватьУчебныйПоиск(Результат, Образец, ОжидаетсяМассив)
    Если ОжидаетсяМассив Тогда
        Если ТипЗнч(Результат) <> Тип("Массив") Тогда
            ВызватьИсключение "Результат не соответствует массиву из установленной справки; требуется проверка этого метода в 1С";
        КонецЕсли;
        Кандидаты = Результат;
    Иначе
        Кандидаты = Новый Массив;
        Если Результат <> Неопределено Тогда
            Если ТипЗнч(Результат) <> Тип("СертификатКриптографии") Тогда
                ВызватьИсключение "Поиск по отпечатку должен вернуть сертификат или Неопределено";
            КонецЕсли;
            Кандидаты.Добавить(Результат);
        КонецЕсли;
    КонецЕсли;
    Строки = Новый Массив;
    НайденоСвоих = 0;
    Для Каждого НайденныйСертификат Из Кандидаты Цикл
        Если ТипЗнч(НайденныйСертификат) <> Тип("СертификатКриптографии") Тогда
            ВызватьИсключение "В результате поиска ожидался сертификат";
        КонецЕсли;
        Если Base64Строка(НайденныйСертификат.Отпечаток) <> Base64Строка(Образец.Отпечаток) Тогда
            Продолжить;
        КонецЕсли;
        CN = Неопределено;
        Если НЕ НайденныйСертификат.Субъект.Свойство("CN", CN) Тогда
            ВызватьИсключение "В собственном образце не найден учебный CN";
        КонецЕсли;
        Если CN <> "Syntax Guide Training Only" Тогда
            ВызватьИсключение "Учебный CN не совпал с собственным DER-образцом";
        КонецЕсли;
        НайденоСвоих = НайденоСвоих + 1;
        Строки.Добавить("Только собственный учебный CN: " + CN);
        Строки.Добавить("Серийный номер образца, Base64: " + Base64Строка(НайденныйСертификат.СерийныйНомер));
        Строки.Добавить("Начало срока образца: " + Строка(НайденныйСертификат.ДатаНачала));
        Строки.Добавить("Окончание срока образца: " + Строка(НайденныйСертификат.ДатаОкончания));
    КонецЦикла;
    Строки.Добавить("Точных учебных совпадений: " + Строка(НайденоСвоих));
    Если НайденоСвоих = 0 Тогда
        Строки.Добавить("В Личном текущего учебного пользователя ОС образец не найден. Это допустимый отрицательный опыт, а не доказательство отсутствия рабочих ключей.");
    КонецЕсли;
    Строки.Добавить("Ничего не импортировано и не подписано. Наличие образца в хранилище не подтверждает доверие.");
    Возврат СтрСоединить(Строки, Символы.ПС);
КонецФункции

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

  1. Проверить собственную конфигурацию, Windows и явное подтверждение отдельного стенда до получения хранилища.

  2. Разобрать встроенные публичные DER-байты и проверить ожидаемый отпечаток собственного образца. Это не импорт сертификата в ОС.

  3. Инициализировать менеджер с настоящими именем провайдера и типом 24 в неинтерактивном режиме.

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

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

  6. Показать только наш учебный CN, серийный номер, срок и число точных совпадений. Отсутствие образца обработать явно; повторный запуск блокировать флагом Занято.

  7. Создать менеджер без модуля; это не успешная загрузка провайдера.

  8. Дождаться инициализации, затем получения хранилища, затем результата поиска.

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

  10. Сохранить менеджер и хранилище в структуре состояния до завершения третьего этапа; между этапами Занято не снимать.

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

  1. Без заранее установленного образца показано «Точных учебных совпадений: 0»; метод не импортирует недостающий сертификат.

  2. В положительном опыте видны только Syntax Guide Training Only и сведения этого DER-образца; чужие совпадения не выводятся.

  3. Пустой/неверный тип, ошибка и незавершённая асинхронная операция не объявляются успешным поиском.

  4. Занято снят только после завершения/ошибки. В хранилище ничего не добавлено/удалено, корневое доверие не менялось.

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

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

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

  1. ХранилищеСертификатовКриптографии не имеет конструктора и не является коллекцией сертификатов в памяти вашей базы. Его получают у инициализированного МенеджерКриптографии.

  2. Чтение текущего пользователя ОС не означает чтение пользователей 1С. Отдельная конфигурация сама по себе не отделяет рабочие сертификаты Windows: нужен отдельный собственный пользователь стенда.

  3. НайтиПоСубъекту и поиск издателя проверяют вхождение строки, а не равенство CN или криптографическую принадлежность. Точный отпечаток проверяется до вывода полей.

  4. НайтиПоОтпечатку и его callback возвращают сертификат либо Неопределено. У НайтиПоОтпечаткуАсинх установленная справка явно указывает массив: нельзя переносить тип результата из синхронного метода.

  5. Если асинхронный отпечаток фактически вернёт тип, отличный от документированного массива, урок остановится с диагностикой несовпадения контракта, а не объявит успех. Это место требует отдельной проверки в 1С.

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

  7. Найденный учебный сертификат не становится доверенным, пригодным для подписи или связанным с закрытым ключом только из-за нахождения в Личном.

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

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

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

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

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

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