Электронная подпись
Генерация сертификатов электронной подписи
Чтобы сгенерировать сертификат электронной подписи, создайте экземпляр типа ГенераторСертификата, установите необходимые атрибуты субъекта сертификата и вызовите метод СоздатьСертификат. По умолчанию будет сгенерирован самоподписанный сертификат, в котором для подписи будет использован сформированный закрытый ключ и указанный алгоритм хеширования. Добавьте сертификат и закрытый ключ в хранилище соответствующего типа (ХранилищеPkcs12 или ХранилищеКриптоПро), используя метод ДобавитьЗакрытыйКлюч.
В примере ниже показано использование Bouncy Castle (криптопровайдера по умолчанию) для создания сертификата электронной подписи с ключами ГОСТ.
метод СоздатьСертификат(Сотрудник: Сотрудник, Пароль: Строка): ХранилищеPkcs12
знч Генератор = новый ГенераторСертификата(АлгоритмАсимметричногоШифрования.Гост3410_2012)
Генератор.УстановитьАтрибутСубъекта(АтрибутX500.Имя, Сотрудник.Имя)
Генератор.УстановитьАтрибутСубъекта(АтрибутX500.Должность, Сотрудник.Должность)
Генератор.УстановитьАтрибутСубъекта(АтрибутX500.Снилс, Сотрудник.Снилс)
Генератор.УстановитьАтрибутСубъекта(АтрибутX500.Инн, Сотрудник.Инн)
Генератор.УстановитьАтрибутСубъекта(АтрибутX500.Организация, "Название организации")
Генератор.ДействителенПо = Момент.Сейчас() + 730д
знч Сертификат = Генератор.СоздатьСертификат()
знч Хранилище = новый ХранилищеPkcs12()
Хранилище.ДобавитьЗакрытыйКлюч(Сотрудник.Имя, Генератор.ЗакрытыйКлюч, Пароль, Сертификат)
возврат Хранилище
;
// Структура, содержащая информацию о сотруднике организации.
структура Сотрудник
пер Имя: Строка
пер Должность: Строка
пер Снилс: Строка
пер Инн: Строка
// ...
;
метод СоздатьСертификат(Сотрудник: Строка, Пароль: Строка)
знч КриптоПро = Криптография.ПолучитьКриптоПроJcsp()
знч ДействителенС = ДатаВремя.Сейчас().НачалоДня().ВМомент(ЧасовойПояс{UTC})
знч ДействителенПо = ДействителенС + 365д
знч Генератор = новый ГенераторСертификата(АлгоритмАсимметричногоШифрования.Гост3410_2012, Криптопровайдер = КриптоПро)
Генератор.СерийныйНомер = Байты{90123456789012345678901234567890}
Генератор.Субъект = "CN=Имя Издателя,O=Организация,OU=Отдел 1"
Генератор.ДействителенС = ДействителенС
Генератор.ДействителенПо = ДействителенПо
знч Сертификат = Генератор.СоздатьСертификат()
знч Хранилище = новый ХранилищеКриптоПро("HDIMAGE")
Хранилище.ДобавитьЗакрытыйКлюч(Сотрудник, Генератор.ЗакрытыйКлюч, Пароль, Сертификат)
;
Вычисление электронной подписи
метод ВычислитьПодпись(Данные: Байты, Хранилище: ХранилищеКриптоПро): Байты
знч Криптопровайдер = Криптография.ПолучитьКриптоПро()
знч Ключ = Хранилище.НайтиЗакрытыйКлюч("Тест", "12345")
знч Сертификат = Хранилище.НайтиСертификат("Тест")
знч Вычислитель = новый ВычислительПодписи(Криптопровайдер, Сертификат, Ключ)
Вычислитель.УстановитьСлужбуШтамповВремени("http://qs.cryptopro.ru/tsp/tsp.srf")
возврат Вычислитель.Подписать(Данные)
;
Замена сертификата
метод УдалитьКорневойСертификат(Подпись: Байты): Байты
знч Верификатор = новый ВерификаторПодписи(Криптография.ПолучитьBouncyCastle(), Подпись)
знч Сертификат = Верификатор.ПолучитьСертификаты().ПервыйИлиУмолчание()
если Сертификат?.СертификатИздателя == Неопределено
возврат Подпись
;
возврат ВычислительПодписи.ЗаменитьСертификат(Подпись, Сертификат.РазорватьЦепочку())
;
Проверка электронной подписи
метод ПроверитьПодпись(Данные: ПотокЧтения, Подпись: Байты): Булево
знч Верификатор = новый ВерификаторПодписи(Криптография.ПолучитьBouncyCastle(), Подпись)
возврат Верификатор.Проверить(Данные)
;
метод ПолучитьМоментПодписи(Подпись: Байты): Момент?
знч Верификатор = новый ВерификаторПодписи(Криптография.ПолучитьBouncyCastle(), Подпись)
возврат Верификатор.МоментПодписи
;
Получение отпечатка цифрового сертификата
метод ВычислитьОтпечаток(БайтыСертификата: Байты): Байты
знч Алгоритм = АлгоритмХеширования.Sha1
знч Криптопровайдер = Криптография.ПолучитьBouncyCastle()
знч Сертификат = новый ЦифровойСертификат(БайтыСертификата)
возврат Сертификат.ПолучитьОтпечаток(Алгоритм, Криптопровайдер)
;