Cryptcp коды ошибок

Пришел сюда за советом, т.к. не могу решить проблему, которая обозначена в заголовке темы. Мне нужно подписать pdf-файл отсоединенной подписью, используя утилиту cryptcp командной строки. Именно через консольную команду нужно, подпись через GUI проблем не вызывает.

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

/opt/cprocsp/bin/amd64/cryptcp -signf -dn “критерий поиска сертификатов” -der secret.pdf

Рядом появляется файл secret.pdf.sgn

/opt/cprocsp/bin/amd64/cryptcp -sign -detach -dn “критерий поиска сертификатов” secret.pdf secret.pdf.sig

Рядом появляется файл secret.pdf.sig

На windows пробовал использовать подобные команды (различие только в пути к утилите), но они не сработали.
Цепочка сертификатов проверяется успешно, но затем возникает ошибка:

# -*- coding: utf-8 -*-Данная лицензия разрешает лицам, получившим копию данного программногообеспечения и сопутствующей документации (в дальнейшем именуемыми «ПрограммноеОбеспечение»), безвозмездно использовать Программное Обеспечение безограничений, включая неограниченное право на использование, копирование,изменение, добавление, публикацию, распространение, сублицензирование и/илипродажу копий Программного Обеспечения, а также лицам, которым предоставляетсяданное Программное Обеспечение, при соблюдении следующих условий:Указанное выше уведомление об авторском праве и данные условия должны бытьвключены во все копии или значимые части данного Программного Обеспечения.ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБОГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ,НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА УЩЕРБ ИЛИ ПО ИНЫМ ТРЕБОВАНИЯМ, В ТОМЧИСЛЕ, ПРИ ДЕЙСТВИИ КОНТРАКТА, ДЕЛИКТЕ ИЛИ ИНОЙ СИТУАЦИИ, ВОЗНИКШИМ ИЗ-ЗАИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ..Permission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the “Software”), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isall copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THELIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN”””Decorator running the function in non-gui thread while processing the gui events.”””# Класс CryptoPro предназнаечен для выполнения криптографических операций над файлами средствами КриптоПро CSP# В конструкторе класса производится проверка текущей архитектуры и доступность# исполняемых файлов Крипто Проu’Текущая архитектура %s не поддерживается’u’СКЗИ Крипто Про CSP или некоторые его компоненты не установлены.’# КОСТЫЛЬ: Создаем временную директорию для хранения отсоединенных подписей# Метод error_description принимает код ошибки и возвращает её описание. Если такой ошибки в словаре нет,# то код ошибки возвращается обратноu’Не удалось открыть файл’u’Операция отменена пользователем’u’Некорректное преобразование BASE64’u’Если указан параметр -help, то других быть не должно’u’Указан лишний файл’u’Указан неизвестный ключ’u’Указана лишняя команда’u’Для ключа не указан параметр’u’Не указана команда’u’Не указан необходимый ключ’u’Указан неверный ключ’u’Параметром ключа -q должно быть натуральное число’u’Не указан входной файл’u’Не указан выходной файл’u’Команда не использует параметр с именем файла’u’Не указан файл сообщения’u’Не удалось открыть хранилище сертификатов:’u’Сертификаты не найдены’u’Найдено более одного сертификата (ключ -1)’u’Команда подразумевает использование только одного сертификата’u’Неверно указан номер’u’Нет используемых сертификатов’u’Данный сертификат не может применяться для этой операции’u’Цепочка сертификатов не проверена. Либо сертификат был отозван или срок действия истек.’u’Криптопровайдер, поддерживающий необходимый алгоритм не найден’u’Неудачный ввод пароля ключевого контейнера’u’Ошибка связи с закрытым ключом’u’Не указана маска файлов’u’Указаны несколько масок файлов’u’Файлы не найдены’u’Задана неверная маска’u’Ключ -start указан, а выходной файл нет’u’Содержимое файла – не подписанное сообщение’u’Неизвестный алгоритм подписи’u’Сертификат автора подписи не найден’u’Подпись не найдена’u’Подпись не верна’u’Штамп времени не верен’u’Содержимое файла – не зашифрованное сообщение’u’Неизвестный алгоритм шифрования’u’Не найден сертификат с соответствующим секретным ключом’u’Не удалось инициализировать cOM’u’Контейнеры не найдены’u’Не удалось получить ответ от сервера’u’Сертификат не найден в ответе сервера’u’Файл не содержит идентификатор запроса:’u’Некорректный адрес ЦС’u’Получен неверный cookie’u’Серийный номер содержит недопустимое количество символов’u’Неверный код продукта’u’Не удалось проверить серийный номер’u’Не удалось сохранить серийный номер’u’Не удалось загрузить серийный номер’u’Отсутствует лицензия КриптоПро CSP’# TODO Показывать алгоритмы подписи и открытого ключа# Генератор get_store_certs выдает найденные в заданном хранилище сертификаты в виде словарей# Метод sign выполняет операцию подписи заданного файла(filepath), при помощи заданного SHA-отпечатка# сертификата(thumbprint) и используя заданную кодировку(encoding): DER или BASE64# Путь до файла должен быть абсолютным. Подписанный файл сохраняется в той же директории с расширением ‘.sig’# Возвращает кортеж с результатом выполнения (True) и предупреждением(если имеется)# TODO Сделать возможность добавления подписи# Исправляем криптопрошные крокозябры# КОСТЫЛЬ переименовываем отсоединенные подписи из sgn в sig# Проверяем наличие в выводе сообщения об ошибке проверки цепочки сертификатов’Certificate chain is not checked for this certificate’# Метод verify проверяет подпись файла(filepath).# Если требуется при этом отсоединить подпись от файла, указываем параметр dettach=True# Возвращает кортеж, состоящий из словаря сертификата, булева значения# указывающего была ли проверена цепочка сертификатов или нет(True – была, False – нет) и# полный вывод запуска утилиты cryptcp для сохранения# TODO Сделать возможность проверки нескольких подписей в одном файле# Если это не файл подписи, проверяем лежащий рядом файл с расширением ‘.sig’# Исправляем криптопрошные крокозябры# КОСТЫЛЬ если подпись оказалась отсоединенной, копируем её в tmp и проверяем при помощи -vsignf’The certificate revocation status or one of the certificates in the certificate chain is”Certificate chain is not checked for this certificate”Trust for this certificate or one of the certificates in the certificate chain has” been revoked”This certificate or one of the certificates in the certificate chain is not time valid.’# Метод encrypt шифрует заданный файл(filepath), при помощи SHA-отпечатка сертификата# или имени файла сертификата (thumbprint), и используя заданную кодировку(encoding): DER или BASE64# Путь до файла должен быть абсолютным. Зашифрованный файл сохраняется в той же директории с расширением ‘.enc’# Исправляем криптопрошные крокозябры’The certificate revocation status or one of the certificates in the certificate chain is”Certificate chain is not checked for this certificate”Trust for this certificate or one of the certificates in the certificate chain has” been revoked”This certificate or one of the certificates in the certificate chain is not time valid.’# Метод decrypt расшифровывает заданный файл(filepath) при помощи SHA-отпечатка сертификата(thumbprint)# Расшифрованный файл сохраняется в той же директории, лишаясь расширения ‘.enc’# Исправляем криптопрошные крокозябры’The certificate revocation status or one of the certificates in the certificate chain is”Certificate chain is not checked for this certificate”Trust for this certificate or one of the certificates in the certificate chain has” been revoked”This certificate or one of the certificates in the certificate chain is not time valid.’

  • В начале года ФСС меняло сертификаты уполномоченного лица. https://lk.fss.ru/eln.html
  • Сообщение от Oksana_Sutormina

    Я скачивала сертификат ФСС, действительный по 2023 год, с сайта ФСС и через программу. Тем не менее всё равно программа не работает. А по приведённой вами ссылке что-то ничего не скачивается.

  • Сообщение от КрысавицаЯ скачивала сертификат ФСС, действительный по 2023 год, с сайта ФСС и через программу.

    Попробуйте еще раз обновить сертификат по инструкции. https://lk.fss.ru/cert.html

  • А какой криптопровайдер установлен на компе?
  • Нашла вот такую информацию:
    код ошибки 1627 криптопро
    Ошибка исполнения функции при подписании ЭЦП
    Ошибка свидетельствует об отсутствии лицензии на продукт КриптоПро CSP. Зачастую она возникает при попытке подписать документ на торговых площадках или в информационных системах (ЕГАИС, ЖКХ, Росреестр, Госуслуги и др.).

Доброе время суток, уже близок к усуществению отсоединённой подписи, присоединённая уже получается и проходит проверку на сайте Сервер электронной подписи КриптоПро DSS.
Возможно Вы сможете помочь с решением вопроса: “Отсоединённой подпись не проходит проверку, а присоединённая подпись проходит”

Вот этим кодом я делаю подпись:

Пробую два варианта:
Вариант отсоединённой подписи не проходит проверку ЭП в КриптоПро DSS:
Код:
sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_X_LONG_TYPE_1, true);

Вариант присоединённой подписи проверку проходит:
Код:
sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_X_LONG_TYPE_1, false);

Оба варианта отрабатывают без ошибок и возвращают на выходе файл
Во вложении оба варианта рассмотрены
sign.zip

Введение.

В одной из поддерживаемых мной систем цифровая подпись сообщений проверялась с помощью КриптоПро CSP и библиотека отвечающая за это функцию периодически падала с ошибкой. Библиотека эта писалась в спешке и не мной, поэтому я решил переделать ее “по-человечески” и оформить в виде python модуля. Ниже я опишу процесс разработки и опишу с какими трудностями я столкнулся.

Теоритическая часть.

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

Все ключи крипто про хранит в своих хранилищах, таких как root, ca, my. Чтобы в них загрузить сертификат в поставке Криптопро CSP идет специальная утилита certmgr. Синтаксих ее работы таков:

Также для корректной цепочки надо загрузить список отозванных сертификатов. Сделать это можно командой:

Побробную информацию по работе этой утилиты можно получить вызвав:

Для конкретного сертификата также можно проверить цепочку. Делается это командой:

Соответственно закрытым ключок соответсвующем проверяемому сертификату и можем подписать сообщение, а с помощью цепочки сертификатов из хранилища, мы сможем ее проверить.

Из всего вышесказанного я подумал, что в библиотеке мне нужны будут следующие функции:

  • Загрузка сертификата в хранилище;
  • Загрузка файла отозванных сертификатов;
  • Постороение цепочки сертификата;
  • Проверка подписи.

Реализация взаимодействия с КриптоПро CSP на C.

Так как КриптоПро CSP(CPCSP) является доработкой CryptoApi от Microsoft, то большая часть примеров из официальной документации подходит идля “КриптоПро”. Чем я собствеено говоря и пользовался при написании модуля, так как с примерами у самого КриптоПро не очень все хорошо.

Загрузка сертификата в хранилище.

Для того, чтобы загрузить сертификат в хранилище нужно выполнить следующие шаги:

  • Считать сертификат из файла
  • Открыть хранилище сертификатов
  • Положить в него сертификат
  • Закрыть хранилище

Тут меня ждал первый ньюанс, что в CPCSP нет функции для чтения сертификата из файла, поэтому ее нужно будет написать вручную. Она выглядит следующим образом:

В коде выше файл считывается специальную структуру CERT, которая содержит размер и содержимое сертификата. Затем на основе этой информации формируется структура PCCERT_CONTEXT, которая в дальнейшем будет загружаться в хранилище CPCSP.

Далее в описании функций будут использоваться следующие коды ошибок:

# define OPERATION_SUCCESS 0
# define OPEN_STORE_ERROR 1
# define ADD_CERT_TO_STORE_ERROR 2
# define CLOSE_STORE_ERROR 3
# define ADD_CRL_TO_STORE_ERROR 4
# define STR_TO_BIN_LEN_ERROR 5
# define STR_TO_BIN_CONTENT_ERROR 6
# define VERIFY_MSG_SIGNATURE 7
# define GET_CERT_CHAIN_ERROR 8
# define READ_CERT_ERROR 9
# define READ_CRL_ERROR 10

Функция загрузки сертификата в хранилище будет выглядеть следующим образом:

В этой функции считывается файл сертификата (функция ReadCertificateFromFile), затем открываем системное хранилище методом CertOpenSystemStore. Если системное хранилище открылось успешно, то с помощью метода CertAddCertificateContextToStore, сертификат загрузается в хранилище. И в заключении хранилище закрывается функцией CertCloseStore.

Нужно отметить что функция CertOpenSystemStore ипользуется только для чтения системных хранилищ (root, ca, my), для остальных надо использовать CertOpenStore.

Загрузка файла отозванных сертификатов.

Функции чтения списка отозванных сертификатов(CRL) и загрузки их в хранилище идентичны функциям работы с сертификатами, за тем исключением, что для их чтения и загрузки используются функции CPCSP c CRL вместо Certificate в названии функции. Например CertAddCertificateContextToStore будет выглядеть как CertAddCRLContextToStore.

Таким образом код для загруки CRL будет таким:

Постороение цепочки сертификата.

Код функции проверки цепочки сертификатов выглядит следующим образом

Помимо настроек цепочки, тут вызывается функция CertGetCertificateChain, которая формирует собственно цепочку сертификатов и записывает ее в структуру PCCERT_CHAIN_CONTEXT. В данной структуре поле TrustStatus отвечает за статус опреации, если цепочка построена корректно, то dwErrorStatus будет 0, иначе будет записан код ошибки.

Прверка подписи.

Для начала я подумал сорфировать самоподписной сертификат для проверки функционирования функции, но оказалось, что CPCSP не поддерживает их, поэтому я создал сертификат в Тестовом УЦ КриптоПро. Я не буду описывать данный процесс, так как к библиотике он имеет посредственное отношение. Только скажу, что файл подписи я генерировал под Windows, потому как это было проще сделать через КриптоПро ЭЦП Browser plug-in.

Код снабжен коментариями, которые поясняют за что какой кусок кода отвечает.

Также надо отметить что функция CryptStringToBinaryA вызывается 2 раза, первый для получения размер подписи, а второй, чтобы получить данные раскодированные из base64 данные. Ну и затем подпись соответственно проверяется.

После того, как все функции написаны, то можно приступуть к реализации С обертки для python библиотеки и написанию тестов.
Для начала опишем заголовочный файл, который будет содержать описание вызываемых функций и исключений:

Как видно из этого файла, на каждый код ошибки С функций, будет соответствовать свое исключение. Реализацию самих функций можно посмотреть в файле py_cpcsp.c репозитория.

Код оберки для библиотеки выглядит следующим образом:

Что делается в этом файле подробно описано здесь.

Для проверки работоспособности питоновской библиотеки, напишем следующий тест:

Теперь все готово, и можно запусть команду make test для проверки работоспособности.

Заключение.

Процесс создания библиотеки получился трудоемкий, но на выходе получилась рабочая библиотека, которой можно пользоваться. В репозиотории можете найти пакет для работы из python, но также можно использовать только C-ную часть. Для работы С библиотеки нужно выполнить make build_c.

Читайте также:  ЧТО ТАКОЕ КОД ОШИБКИ 88780078

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *