СертификатКриптографии.Для инициализации

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

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

Синтаксис

Новый СертификатКриптографии()
Полное описание, параметры и ограничения

СертификатКриптографии.Для инициализации

СертификатКриптографии (CryptoCertificate)

Для инициализации

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

Синтаксис:
Новый СертификатКриптографии()
Описание:

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

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

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

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

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

Загрузить публичный сертификат оповещением и выгрузить байты

Полный модуль формы показывает параметры обоих callbacks: созданный сертификат приходит первым аргументом инициализации, публичные байты — первым аргументом выгрузки без имени файла.

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

Полный модуль управляемой формы учебной обработки Windows; два callbacks и точная очистка собственного CER.

Подготовка

  1. В отдельной учебной базе создайте внешнюю обработку с пустой управляемой формой, командой УчебныйПример и кнопкой. Укажите действие УчебныйПример и вставьте весь модуль.

  2. Запускайте в Windows-клиенте 8.5.1.1343. НачатьИнициализацию принимает путь CER: поэтому этот урок создаёт ровно один уникальный собственный временный файл.

  3. Встроенный сертификат тот же публичный учебный Syntax Guide Training Only: закрытого ключа, установки в ОС и доверия нет.

  4. Используйте Windows-клиент или Windows-сервер 1С 8.5.1.1343. Проверка других ОС, веб-клиента и расширений криптографии этим уроком не подтверждена.

  5. Не заменяйте учебный сертификат рабочим для первого запуска. Код ничего не подписывает, не импортирует в хранилища, не обращается к OCSP/CRL и не просит пароль.

Перем Выполняется;

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

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

&НаКлиенте
Процедура ОшибкаОперации(Ошибка, СтандартнаяОбработка, Состояние) Экспорт
    ОсвободитьСвойФайл(Состояние);
    Выполняется = Ложь;
    СтандартнаяОбработка = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОсвободитьСвойФайл(Состояние)
    Если Состояние.Поток <> Неопределено Тогда
        Попытка
            Состояние.Поток.Закрыть();
            Состояние.Поток = Неопределено;
        Исключение
            Сообщить("Не удалось закрыть собственный CER-поток: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
    Если Состояние.СвойФайл Тогда
        Попытка
            УдалитьФайлы(Состояние.ИмяФайла);
            Состояние.СвойФайл = Ложь;
        Исключение
            Сообщить("Не удалось удалить только собственный временный CER: " + Состояние.ИмяФайла + "; " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

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

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

  2. НачатьИнициализацию получает оповещение и имя файла. ПослеИнициализации(ЗагруженныйСертификат, Состояние) принимает созданный объект и сохраняет его в состоянии.

  3. НачатьВыгрузку без файлового имени возвращает данные в ПослеВыгрузки(ВыгруженныеДанные, Состояние). Сравниваем их с исходным DER.

  4. После завершения удаляем точный собственный CER под защитой флага и проверяем отсутствие. Коллекции сертификатов ОС не меняются.

  5. Флаг Выполняется препятствует повторному старту. Ошибки операции и ошибки следующего шага идут через очистку, а не через сообщение об успешном завершении.

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

  1. Три сравнения Истина: отпечаток, исходные DER-байты и отсутствие своего файла.

  2. При повторном нажатии до окончания ожидается сообщение дождаться своей цепочки.

  3. При отказе удаления выводится точное имя; отдельная проверка вызывает исключение до сообщения об успешном завершении.

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

Созданный результат инициализации и результат публичной выгрузки обработаны правильными callbacks.

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

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

  2. Не подставляйте путь к рабочему сертификату: этот модуль должен обслуживать только созданный им CER.

  3. Нельзя удалять CER сразу после НачатьИнициализацию: асинхронная операция ещё может читать его.

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

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

ИнициализироватьАсинх возвращает обещание созданного объекта. Используем именно результат Ждать, затем ожидаем публичную выгрузку.

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

Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.

Подготовка

  1. Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.

  2. В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.

  3. Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.

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

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

  6. Используйте Windows-клиент или Windows-сервер 1С 8.5.1.1343. Проверка других ОС, веб-клиента и расширений криптографии этим уроком не подтверждена.

  7. Не заменяйте учебный сертификат рабочим для первого запуска. Код ничего не подписывает, не импортирует в хранилища, не обращается к OCSP/CRL и не просит пароль.

&НаКлиенте
Асинх Процедура УчебныйПример(Команда)
    ИсходныеДанные = 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Строка(Выгруженные) = Base64Строка(ИсходныеДанные));
    Сообщить(Base64Строка(Сертификат.Отпечаток) = "tRDNiwoaiFssHhQqwyjWVlPLdns=");
КонецПроцедуры

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

  1. Фрагмент — полный клиентский модуль учебной формы с Асинх процедурой команды.

  2. Конструктор без аргументов создаёт инициализатор, а не уже загруженный сертификат.

  3. Результат Ждать ИнициализироватьАсинх — созданный СертификатКриптографии. Не теряем его и не подменяем объектом Обещание.

  4. ВыгрузитьАсинх без имени файла возвращает через Ждать публичные ДвоичныеДанные; проверяем тип и содержимое.

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

  1. Два сравнения Истина и отсутствие файлов.

  2. В отладчике Сертификат — созданный результат, Выгруженные — ДвоичныеДанные, не Обещание.

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

Правильно использован результат асинхронной инициализации и публичной выгрузки.

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

  1. Обычная процедура без Асинх не подходит для этого Ждать.

  2. Инициализатор и созданный сертификат нельзя считать одним объектом без проверки контракта.

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

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

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

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

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