ХранилищеСертификатовКриптографии.ПолучитьВсеАсинх

Методы · GetAllAsync

Асинхронная функция. Получает массив всех сертификатов криптографии.

Синтаксис

ПолучитьВсеАсинх()
Полное описание, параметры и ограничения

ХранилищеСертификатовКриптографии.ПолучитьВсеАсинх (CryptoCertificateStore.GetAllAsync)

ХранилищеСертификатовКриптографии (CryptoCertificateStore)

ПолучитьВсеАсинх (GetAllAsync)

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

Синтаксис:
ПолучитьВсеАсинх()
Возвращаемое значение:
Тип: Обещание.
Результат выполнения обещания - массив объектов типа СертификатКриптографии.
Описание:

Асинхронная функция. Получает массив всех сертификатов криптографии.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

См. также:
ХранилищеСертификатовКриптографии, метод НачатьПолучениеВсех
ХранилищеСертификатовКриптографии, метод ПолучитьВсе

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

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

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

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

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

Полный изолированный опыт с реальным 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С не запускался.

Подготовка

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

&НаКлиенте
Процедура ПроверитьУчебнуюПлатформу()
    Система = Новый СистемнаяИнформация;
    Если Система.ТипПлатформы <> ТипПлатформы.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. Асинх Процедура получает окончательные значения через Ждать. Не использовать само Обещание как сертификат или массив.

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

  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С» и не аффилирован с ней.