Как конвертировать и использовать RSA-ключ в формате PEM для подписи запросов в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции с современными API, такими как Яндекс.Навигатор, разработчики 1С часто сталкиваются с необходимостью подписывать запросы с использованием RSA ключей. Основная сложность заключается в том, что «Менеджер криптографии» 1С не всегда понимает стандартный формат PEM, который мы получаем в виде строки с заголовком -----BEGIN RSA PRIVATE KEY-----.

Рассмотрим по шагам, как решить эту задачу, разобрать ключ и правильно вычислить подпись.

Понимание структуры ключа PEM

Файлы в формате PEM — это не просто текст, а ASN.1 структура, закодированная в Base64. Для 1С этот файл является «черным ящиком». Чтобы использовать его в вычислениях, нам нужно извлечь математические параметры ключа. Ключ RSA в данном формате содержит последовательность из девяти целых чисел (INTEGER):

  1. Версия.
  2. Модуль n.
  3. Открытая экспонента e.
  4. Секретная экспонента d.
  5. Простой множитель p.
  6. Простой множитель q.
  7. Параметр dP.
  8. Параметр dQ.
  9. Параметр InverseQ.

Для вычисления подписи SHA256-RSA вам потребуются эти параметры. Их необходимо извлечь из структуры ASN.1, перевести из шестнадцатеричной строки в числа и использовать в алгоритме подписи.

Реализация алгоритма подписи на 1С

Если вам удалось распарсить ключ и получить значения параметров в структуру, следующим этапом будет формирование подписи. Важно помнить, что Яндекс (как и многие другие сервисы) требует не «шифрование» ключом, а создание цифровой подписи (Digital Signature).

Процесс подписи состоит из следующих этапов:

  1. Вычисление хеша SHA-256 от исходной строки данных.
  2. Дополнение (padding) хеша согласно стандарту PKCS#1 v1.5. Без этого этапа подпись будет неверной.
  3. Математическая операция возведения в степень по модулю с использованием параметров ключа.
  4. Кодирование результата в 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 обратите внимание на следующие моменты:

Что делать, если ключ не парсится?

Если ваша обработка не может разобрать 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) он хранился изначально.

← На главную