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