В процессе разработки интеграций с государственными сервисами, такими как СМЭВ или различные порталы госуслуг, перед программистами 1С часто встает задача работы с электронной подписью. Нередко выясняется, что для решения специфических задач уже существуют готовые компоненты, входящие в состав платформы или библиотеки БСП, такие как ExtraCryptoAPIAddInNative или libXadesAddIn. Однако официальная документация по ним практически отсутствует.
Давайте разберем, как нам «заглянуть внутрь» этих компонент и изучить недокументированные возможности платформы, не прибегая к написанию собственного «велосипеда» с нуля.
Важно осознать, что ExtraCryptoAPIAddInNative и аналогичные модули — это внутренние инструменты 1С. Фирма «1С» использует их как «черный ящик» для реализации функционала БСП. Это означает следующее:
Самый эффективный способ узнать, что умеет компонента, — это программно опросить её. В 1С компоненты подключаются как Native API. Мы можем использовать методы объекта для получения списка всех доступных функций.
Рассмотрим, как это выглядит на практике. Когда мы подключаем компоненту, она предоставляет объект, у которого можно запросить список методов. Благодаря сообществам разработчиков, мы уже знаем структуру методов для ExtraCryptoAPI.
Ниже приведен список основных методов, которые удалось выявить путем анализа:
C14N(p1, p2) — выполнение канонизации XML.Hash(p1, p2, p3) — вычисление хеш-суммы данных.Sign(p1, p2, p3) — создание цифровой подписи.VerifySign(p1, p2, p3, p4) — проверка подписи.XadesTSign(p1, p2, p3, p4, p5, p6, p7) — создание подписи в формате XAdES.EnumCert(p1) — перечисление установленных сертификатов (похожим образом работают и другие Native компоненты).Часто возникает вопрос: как работать с криптографией на Linux, где нет привычных COM-объектов Windows (например, CAdESCOM.HashedData)? Разберем альтернативный подход к вычислению хеша.
Если нам необходимо вычислить хеш на стороне сервера Linux, мы можем использовать следующий алгоритм работы:
// Инициализация параметров
CADESCOM_BASE64_TO_BINARY = 1;
CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256 = 101;
// Работа с объектом HashedData
HashedData = Новый COMОбъект("CAdESCOM.HashedData");
HashedData.Algorithm = CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;
HashedData.DataEncoding = CADESCOM_BASE64_TO_BINARY;
HashedData.Hash(СертификатКриптографииBase64);
// Получение результата
Хэш_HEXстрока = HashedData.Value;
Хэш_ДвочиныеДанные = ПолучитьДвоичныеДанныеИзHexСтроки(Хэш_HEXстрока);
digest = Base64Строка(Хэш_ДвочиныеДанные);
В среде Linux, где COM недоступен, рекомендуется использовать официальные утилиты КриптоПро, например cryptcp, вызывая их через команду ЗапуститьПриложение(). Это наиболее стабильный путь, который не зависит от внутренних изменений в платформе 1С.
Проанализировав ситуацию, можно сделать следующие выводы для нашей работы:
ExtraCryptoAPI, посмотрите, как это делает сама 1С в модулях БСП. Это даст вам понимание правильной последовательности параметров для методов Sign или XadesTSign.Помните, что использование недокументированных функций — это временное решение для закрытия «узких мест». Всегда стремитесь к использованию официальных интерфейсов производителя криптопровайдера, чтобы ваша система оставалась обновляемой и стабильной в долгосрочной перспективе.