Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Алексей Тюленев  
#1 Оставлено : 31 октября 2025 г. 16:48:22(UTC)
Алексей Тюленев

Статус: Новичок

Группы: Участники
Зарегистрирован: 31.10.2025(UTC)
Сообщений: 6
Российская Федерация

Подпись созданная с помощью dotnetcades не проходит проверку в API ЕСИА и не дает получить токен, при этом подпись сделанная на этой же машине с помощью приложения командной строки cryptcp работает как надо и токен можно получить.
OS Ubuntu 24.04.3
Crypto-PRo CSP Ver:5:0.13600 OS:Linux CPU:AMD64

Условие: для получения токена Госключа необходимо отправить запрос на https://esia-portal1.tes...s/api/public/v1/orgs/ext–app/{UUID}/tkn?signature={SIGNATURE}
где UUID - это API-ключ, а SIGNATURE - подпись запроса в формате PKCS#7 detached signature в формате urlSafeBase64 в кодировке UTF-8 – подписанный не ранее, чем за 24 часа (86400 с) параметр UUID сертификатом организации, на сотрудника которой был выдан (сформирован) идентификационный ключ
Для формирование подписи SIGNATURE и получения токена используется этот код:

Код:
using dotnetcades;
namespace signconsole;

public static class StaticMethods
{
    const string APIKey = "332e92df-886c-46f5-8650-57a7cbc33fc0";
    public static async Task<string?> SignDataAsync()
    {
        using var oStore = new dotnetcades.Store();
        oStore.Open(NC.CADESCOM_CURRENT_USER_STORE, NC.CAPICOM_MY_STORE, NC.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
        using var oCertificates = oStore.Certificates;
        // В хранилище только один сертификат с закрытым ключом
        var oCertificate = oCertificates.Item(1);
        using var oSigner = new dotnetcades.Signer();
        oSigner.Certificate = oCertificate;
        // следующие две строки добавлены для возможности использования тестового сертификата госуслуг
        oSigner.CheckCertificate = false; // Отключаем проверку сертификата
        oSigner.Options = NC.CADESCOM_AllowUntrustedCertificate; // Разрешаем использование недоверенных сертификатов
        oSigner.KeyPin = "1234567890";
        using var oSignedData = new dotnetcades.SignedData();
        oSignedData.Content = APIKey;
        var signature = oSignedData.SignCades(oSigner, NC.CADESCOM_PKCS7_TYPE, true, NC.CADESCOM_ENCODE_BASE64);
        return signature;
    }
    public static async Task GetTokenAsync()
    {
        var sig = await SignDataAsync();
        using var httpClient = new HttpClient();
        var requestUri =
        "https://esia-portal1.test.gosuslugi.ru"
        + "/esia-rs/api/public/v1/orgs/ext-app/"
        + APIKey + "/tkn?signature="
        + System.Net.WebUtility.UrlEncode(sig);
        var res = await httpClient.GetAsync(requestUri);
        var resContent = await res.Content.ReadAsStringAsync();
        Console.WriteLine($"Response: {res.StatusCode} {resContent}");
    }
}


При выполнении `GetTokenAsync` получаем ответ

Цитата:
Unauthorized {"code":"ESIA-005002","message":"Некорректная подпись"}


При этом подпись сделанная на этой же машине с помощью приложения командной строки с параметрами:

Код:
/opt/cprocsp/bin/amd64/cryptcp -sign -uMy -dn=CN -nochain -der -pin 1234567890 -fext .p7s key.txt


проходит проверку и в ответ на GET запрос получаем токен

Отредактировано пользователем 31 октября 2025 г. 17:17:02(UTC)  | Причина: DataToSign = APIKey

Offline Андрей *  
#2 Оставлено : 31 октября 2025 г. 16:52:35(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,984
Мужчина
Российская Федерация

Сказал «Спасибо»: 605 раз
Поблагодарили: 2350 раз в 1846 постах
Здравствуйте.

Ответ прям в коде же и условиях...

DataToSign - что внутри?

CADESCOM_ENCODE_BASE64 не равно urlSafeBase64


PKCS#7 detached signature - вообще печально такое читать в документации...


Вы проверяли, что на выходе от cryptcp?
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#3 Оставлено : 31 октября 2025 г. 16:58:12(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,984
Мужчина
Российская Федерация

Сказал «Спасибо»: 605 раз
Поблагодарили: 2350 раз в 1846 постах
detached signature для cryptcp -detach тогда должен быть в параметрах, его нет, верно?
cryptcp - формирует cades bes (что уже выше по стандарту, чем древний pkcs7)


UrlEncode от base64 (а строки через LF (!) ) - это нормально будет сервису?

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#4 Оставлено : 31 октября 2025 г. 17:00:05(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,984
Мужчина
Российская Федерация

Сказал «Спасибо»: 605 раз
Поблагодарили: 2350 раз в 1846 постах
ради интереса в SignCades указать false ...
Техническую поддержку оказываем тут
Наша база знаний
Offline Алексей Тюленев  
#5 Оставлено : 31 октября 2025 г. 17:04:23(UTC)
Алексей Тюленев

Статус: Новичок

Группы: Участники
Зарегистрирован: 31.10.2025(UTC)
Сообщений: 6
Российская Федерация

Автор: Андрей * Перейти к цитате

CADESCOM_ENCODE_BASE64 не равно urlSafeBase64


CADESCOM_ENCODE_BASE64 - это чтобы получить Base64,
За UrlSafe отвечает System.Net.WebUtility.UrlEncode(sig)

Offline Алексей Тюленев  
#6 Оставлено : 31 октября 2025 г. 17:08:15(UTC)
Алексей Тюленев

Статус: Новичок

Группы: Участники
Зарегистрирован: 31.10.2025(UTC)
Сообщений: 6
Российская Федерация

Автор: Андрей * Перейти к цитате
detached signature для cryptcp -detach тогда должен быть в параметрах, его нет, верно?


при изменении true на false в Signcades ничего не меняется

Отредактировано пользователем 31 октября 2025 г. 17:15:53(UTC)  | Причина: Не указана

Offline Алексей Тюленев  
#7 Оставлено : 31 октября 2025 г. 17:10:06(UTC)
Алексей Тюленев

Статус: Новичок

Группы: Участники
Зарегистрирован: 31.10.2025(UTC)
Сообщений: 6
Российская Федерация

Автор: Андрей * Перейти к цитате
ради интереса в SignCades указать false ...

Пробовал, ничего не меняется
Offline Алексей Тюленев  
#8 Оставлено : 31 октября 2025 г. 17:11:35(UTC)
Алексей Тюленев

Статус: Новичок

Группы: Участники
Зарегистрирован: 31.10.2025(UTC)
Сообщений: 6
Российская Федерация

Автор: Андрей * Перейти к цитате

DataToSign - что внутри?


Там APIkey, та же строка.
Offline Андрей *  
#9 Оставлено : 31 октября 2025 г. 17:19:48(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,984
Мужчина
Российская Федерация

Сказал «Спасибо»: 605 раз
Поблагодарили: 2350 раз в 1846 постах
Автор: Алексей Тюленев Перейти к цитате
Автор: Андрей * Перейти к цитате

DataToSign - что внутри?


Там APIkey, та же строка.


приложить сюда\в личку примеры файлов хороший\плохой....
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#10 Оставлено : 31 октября 2025 г. 22:05:45(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,984
Мужчина
Российская Федерация

Сказал «Спасибо»: 605 раз
Поблагодарили: 2350 раз в 1846 постах
Получил файлы, анализ занял 2с...

bad.p7s и good.p7s - обе подписи в них - валидны, присоединенные + base64.

А вот с подписанными данными - проблема:

в bad.p7s - 72 байта подписано
в good.p7s - 36...
А мы же знаем, что 36... это тот самый.. guid в тестовом варианте...

А 72 ...
это если... UTF

bad.png (4kb) загружен 5 раз(а).

good.png (4kb) загружен 4 раз(а).

Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.