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

Типы · CryptoCertificate

Электронный документ, включающий открытый ключ и информацию о владельце данного ключа, заверенную с помощью электронной цифровой подписи удостоверяющим центром. При сравнении сертификатов средствами встроенного языка выполняется сравнение серийного номера сертификата и структуры издателя сертификата.

Полное описание, параметры и ограничения

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

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

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

Свойства:
АлгоритмОткрытогоКлюча (PublicKeyAlgorithm)
АлгоритмПодписи (SignatureAlgorithm)
Версия (Version)
ДатаНачала (ValidFrom)
ДатаОкончания (ValidTo)
ДополненияСертификата (CertificateExtensions)
ДополненияСертификатаКакИсходныеДанные (CertificateExtensionsAsRawData)
ЗначениеПодписи (SignatureValue)
Издатель (Issuer)
ИспользоватьДляПодписи (UseToSign)
ИспользоватьДляШифрования (UseToEncrypt)
ОткрытыйКлюч (PublicKey)
Отпечаток (Thumbprint)
РасширенныеСвойства (Extensions)
СерийныйНомер (SerialNumber)
Субъект (Subject)
УниверсальнаяДатаНачалаЗакрытогоКлюча (StartUniversalDateOfPrivateKey)
УниверсальнаяДатаОкончанияЗакрытогоКлюча (UniversalDateOfPrivateKeyExpiration)

Методы:
Выгрузить (Unload)
ВыгрузитьАсинх (UnloadAsync)
ИнициализироватьАсинх (InitializeAsync)
НачатьВыгрузку (BeginUnloading)
НачатьИнициализацию (BeginInitialization)

Конструкторы:
Для инициализации
Из двоичных данных
Из файла

Описание:

Электронный документ, включающий открытый ключ и информацию о владельце данного ключа, заверенную с помощью электронной цифровой подписи удостоверяющим центром.
При сравнении сертификатов средствами встроенного языка выполняется сравнение серийного номера сертификата и структуры издателя сертификата.

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

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

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

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

Описание изменено в версии 8.3.27.

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

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

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

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