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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Leonra_NzOe075n  
#1 Оставлено : 29 февраля 2024 г. 12:37:39(UTC)
Leonra_NzOe075n

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

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

Сказал(а) «Спасибо»: 1 раз
Здравствуйте, уважаемые форумчане!
Помогите, пожалуйста, разобраться с авторизацией на Госуслугах.

Задача: требуется "подпись запроса в формате PKCS#7 detached signature в формате urlSafeBase64 в кодировке UTF-8 – подписанный не ранее, чем за 24 часа (86400 с) параметр UUID сертификатом организации, на сотрудника которой был выдан (сформирован) идентификационный ключ".

Я установила КриптоПро .NET и КриптоПро .NET SDK. Нашла примеры - .NET SDK\Examples\simple.zip\CMS\cs\DetachedSignature.cs
Приложение на c#, netcoreapp3.1.
Формирую подпись следующим образом:
Код:
public static byte[] DoIt(string thumbprint, string msg)
{
    Encoding unicode = Encoding.UTF8;
    byte[] msgBytes = unicode.GetBytes(msg);
    X509Certificate2 signerCert = GetSignerCert(thumbprint);
    byte[] encodedSignature = SignMsg(msgBytes, signerCert);
    VerifyMsg(msgBytes, encodedSignature);
    return encodedSignature;
}

private static X509Certificate2 GetSignerCert(string thumbprint)
{
    var storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    storeMy.Open(OpenFlags.ReadOnly);
    X509Certificate2Collection certColl = storeMy.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);
    storeMy.Close();
    return certColl[0];
}

private static byte[] SignMsg(byte[] msg, X509Certificate2 signerCert)
{
    var contentInfo = new ContentInfo(msg);
    var signedCms = new SignedCms(contentInfo, true);
    var cmsSigner = new CmsSigner(signerCert);
    signedCms.ComputeSignature(cmsSigner);
    return signedCms.Encode();
}

private static void VerifyMsg(byte[] msg, byte[] encodedSignature)
{
    var contentInfo = new ContentInfo(msg);
    var signedCms = new SignedCms(contentInfo, true);
    signedCms.Decode(encodedSignature);
    signedCms.CheckSignature(true);
}


Далее преобразовываю полученный массив байт в строку и заменяю спец.символы:
Код:
public static string Encode(byte[] bytes)
{
    string data = Convert.ToBase64String(bytes);
    return data;
}

public static string PrepareSafeUrl(string data)
{
    data = data.TrimEnd('=');
    data = data.Replace("+", "%2b");
    data = data.Replace("/", "%2f");
    data = data.Replace("=", "%3d");
    return data;
}


Итоговый код:
Код:
byte[] signatureArray = DetachedSignatureCompact.DoIt(thumbprint, apiCode);
string signature = TrueEncodeHelper.Encode(signatureArray);
signature = TrueEncodeHelper.PrepareSafeUrl(signature);


Далее обращаюсь к методу REST API ЕСИА GET >/esia-rs/api/public/v1/orgs/ext-app/{UUID}/tkn и получаю
Цитата:
{"code":"ESIA-005002","message":"Invalid signature"}
Что означает: Некорректная подпись запроса (параметр signature некорректного формата или подписанный UUID не соответствует указанному в URL метода параметру UUID).
Помогите, пожалуйста, как нужно правильно преобразовать сформированную подпись?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.