При интеграции с современными API, такими как Яндекс.Навигатор, разработчики 1С часто сталкиваются с необходимостью подписывать запросы с использованием RSA ключей. Основная сложность заключается в том, что «Менеджер криптографии» 1С не всегда понимает стандартный формат PEM, который мы получаем в виде строки с заголовком -----BEGIN RSA PRIVATE KEY-----.
Рассмотрим по шагам, как решить эту задачу, разобрать ключ и правильно вычислить подпись.
Файлы в формате PEM — это не просто текст, а ASN.1 структура, закодированная в Base64. Для 1С этот файл является «черным ящиком». Чтобы использовать его в вычислениях, нам нужно извлечь математические параметры ключа. Ключ RSA в данном формате содержит последовательность из девяти целых чисел (INTEGER):
n.e.d.p.q.dP.dQ.InverseQ.Для вычисления подписи SHA256-RSA вам потребуются эти параметры. Их необходимо извлечь из структуры ASN.1, перевести из шестнадцатеричной строки в числа и использовать в алгоритме подписи.
Если вам удалось распарсить ключ и получить значения параметров в структуру, следующим этапом будет формирование подписи. Важно помнить, что Яндекс (как и многие другие сервисы) требует не «шифрование» ключом, а создание цифровой подписи (Digital Signature).
Процесс подписи состоит из следующих этапов:
SHA-256 от исходной строки данных.PKCS#1 v1.5. Без этого этапа подпись будет неверной.Base64 и последующее URL-encoding.Рассмотрим пример того, как может выглядеть логика формирования строки с подписью:
// Исходная строка для запроса
ИсходнаяСтрока = "yandexnavi://show_point_on_map?lat=55.75&lon=37.64&zoom=14&client=007";
// Вычисляем хеш
Хеширование = Новый ХешированиеДанных(ХешФункция.SHA256);
Хеширование.Добавить(ИсходнаяСтрока);
ХешДвоичный = Хеширование.ХешСумма;
// Вычисляем подпись с помощью разобранного ключа
ПодписьДвоичная = ПолучитьПодписьSHA256RSA(ХешДвоичный, СтруктураСертификата);
// Кодируем результат
Подпись64 = Base64Строка(ПодписьДвоичная);
Подпись64Урл = КодироватьСтроку(Подпись64, СпособКодированияСтроки.КодировкаURL);
// Формируем итоговую строку
Результат = ИсходнаяСтрока + "&signature=" + Подпись64Урл;
При реализации метода ПолучитьПодписьSHA256RSA обратите внимание на следующие моменты:
PKCS#1 v1.5, перед подписыванием хеш дополняется специальными данными. Это критический этап. Если вы не добавите нужные байты, сервис вернет ошибку авторизации.Base64Url, в других — обычный Base64.ASN.1, рассмотрите вариант выноса логики подписи на внешний Python-скрипт или микросервис. Python позволяет работать с библиотекой PyCryptodome, которая делает эту работу за пару строк кода, гарантируя соответствие стандартам.Если ваша обработка не может разобрать PEM файл, попробуйте конвертировать его в формат PFX (PKCS#12) с помощью инструментов командной строки, например OpenSSL:
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt
После этого с полученным файлом можно работать через системные библиотеки Windows (например, через COM-объект X509Certificate2 в PowerShell или 1С), что часто является более надежным способом, чем ручной парсинг ASN.1.
Работая с RSA, всегда помните: ключ — это математический объект. Как только вы извлекли компоненты Modulus и Exponent, вы получаете полный контроль над операцией подписи, независимо от того, в какой обертке (PEM, XML или DER) он хранился изначально.