Поиск субъекта означает вхождение строки в данные субъекта. Он может вернуть посторонние совпадения; CN без точного отпечатка не принимается как собственный сертификат. Полный модуль читает только выбранную область и показывает исключительно наш публичный учебный образец.
Где и как запускать
Полный модуль управляемой формы; своя отдельная Windows-учётная запись и пустая учебная конфигурация на 8.5.1.1343. Поиск своего публичного DER в Личном текущего пользователя ОС. Здесь в 1С не запускался.
Подготовка
Используйте свою отдельную пустую конфигурацию УчебнаяКонфигурацияСинтаксиса и Windows-клиент ровно 8.5.1.1343. Рабочие базы и служебные учётные записи сервера исключены.
Для опыта с системным хранилищем войдите в отдельную собственную учебную учётную запись Windows без рабочих сертификатов. Хранилище не принадлежит базе 1С: оно принадлежит текущему пользователю ОС.
Создайте свою обработку с управляемой формой: Занято — Булево, начально Ложь; ПодтверждаюОтдельныйСтенд — Булево, начально Ложь; Отчёт — Строка длиной 0, многострочное поле только для просмотра.
Создайте команду НайтиУчебныйСертификат и свяжите с одноимённым клиентским обработчиком. Вставьте полный модуль одного урока, включая общие функции и экспортные callback.
Перед запуском вручную убедитесь, что вошли именно в свой отдельный Windows-стенд, затем отметьте ПодтверждаюОтдельныйСтенд. Флажок — подтверждение оператора, а не автоматическая проверка личности Windows-пользователя.
В код встроен публичный DER-сертификат Syntax Guide Training Only. Закрытого ключа в нём нет; он не доверенный и не был установлен при подготовке этих уроков.
Первый опыт выполняйте без установки образца: корректный результат — ноль найденных учебных сертификатов. Код не создаёт отсутствующий сертификат в хранилище и не объявляет пустой результат ошибкой криптографии.
Для положительного опыта администратор вашего отдельного стенда может заранее вручную разместить только этот публичный CER-образец в Личное текущей учебной учётной записи. Не помещайте его в Доверенные корневые и не используйте рабочий PFX. Эти примеры не выполняют импорт.
Microsoft Enhanced RSA and AES Cryptographic Provider и числовой тип 24 подтверждены в установленной Windows-регистрации. Если он отсутствует на своём стенде, остановитесь; нельзя угадывать имя, тип или путь библиотеки.
Открывается только ПерсональныеСертификаты + ДанныеПользователяОС. Это не хранилище локального компьютера, не корневое и не мобильное ДанныеПриложения. Другие области не открываются автоматически при пустом результате.
Субъект и издатель в поиске сопоставляются по содержащейся строке, поэтому окончательная принадлежность образцу проверяется по точному отпечатку DER. Название CN само по себе недостаточно.
Весь отчёт остаётся в форме. Нет подписи, PIN, закрытого ключа, файла, HTTP, OCSP/CRL, установки расширения, Добавить/Удалить или изменения доверия ОС.
Синхронный вариант требует разрешённого режима синхронных вызовов. В варианте Ждать весь обработчик Асинх; в callback-цепочке результат возникает только после трёх этапов.
При подготовке хранилище не открывалось и код в 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 Тогда
Строки.Добавить("В Личном текущего учебного пользователя ОС образец не найден. Это допустимый отрицательный опыт, а не доказательство отсутствия рабочих ключей.");
КонецЕсли;
Строки.Добавить("Ничего не импортировано и не подписано. Наличие образца в хранилище не подтверждает доверие.");
Возврат СтрСоединить(Строки, Символы.ПС);
КонецФункции
Разбор по шагам
Проверить собственную конфигурацию, Windows и явное подтверждение отдельного стенда до получения хранилища.
Разобрать встроенные публичные DER-байты и проверить ожидаемый отпечаток собственного образца. Это не импорт сертификата в ОС.
Инициализировать менеджер с настоящими именем провайдера и типом 24 в неинтерактивном режиме.
Получить хранилище конкретного типа и расположения, затем проверить тип возвращённого объекта. Не создавать его через Новый.
Выполнить только выбранный поиск, принять документированный тип результата и отфильтровать посторонние совпадения по точному отпечатку.
Показать только наш учебный CN, серийный номер, срок и число точных совпадений. Отсутствие образца обработать явно; повторный запуск блокировать флагом Занято.
Создать менеджер без модуля; это не успешная загрузка провайдера.
Дождаться инициализации, затем получения хранилища, затем результата поиска.
Три экспортных обработчика получают менеджер, хранилище и результат поиска первым аргументом; вторым всегда приходит собственное Состояние.
Сохранить менеджер и хранилище в структуре состояния до завершения третьего этапа; между этапами Занято не снимать.
Как проверить результат
Без заранее установленного образца показано «Точных учебных совпадений: 0»; метод не импортирует недостающий сертификат.
В положительном опыте видны только Syntax Guide Training Only и сведения этого DER-образца; чужие совпадения не выводятся.
Пустой/неверный тип, ошибка и незавершённая асинхронная операция не объявляются успешным поиском.
Занято снят только после завершения/ошибки. В хранилище ничего не добавлено/удалено, корневое доверие не менялось.
Ожидаемый результат
В своей форме получен проверяемый положительный или отрицательный результат поиска публичного учебного образца, без закрытого ключа и без изменения системного хранилища.
На что обратить внимание
ХранилищеСертификатовКриптографии не имеет конструктора и не является коллекцией сертификатов в памяти вашей базы. Его получают у инициализированного МенеджерКриптографии.
Чтение текущего пользователя ОС не означает чтение пользователей 1С. Отдельная конфигурация сама по себе не отделяет рабочие сертификаты Windows: нужен отдельный собственный пользователь стенда.
НайтиПоСубъекту и поиск издателя проверяют вхождение строки, а не равенство CN или криптографическую принадлежность. Точный отпечаток проверяется до вывода полей.
НайтиПоОтпечатку и его callback возвращают сертификат либо Неопределено. У НайтиПоОтпечаткуАсинх установленная справка явно указывает массив: нельзя переносить тип результата из синхронного метода.
Если асинхронный отпечаток фактически вернёт тип, отличный от документированного массива, урок остановится с диагностикой несовпадения контракта, а не объявит успех. Это место требует отдельной проверки в 1С.
Пустая выборка означает отсутствие именно нашего публичного образца в выбранной области. Не следует из неё делать вывод, что у человека нет рабочего ключа или сертификата в другой области.
Найденный учебный сертификат не становится доверенным, пригодным для подписи или связанным с закрытым ключом только из-за нахождения в Личном.
Не подменяйте учебный отпечаток чужим. Отчёт не выводит субъект, издателя, серийный номер или даты непривязанного к образцу сертификата.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.