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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Алексей Ворощак  
#1 Оставлено : 13 июля 2023 г. 13:21:03(UTC)
Алексей Ворощак

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

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

Добрый день.

Занимаюсь интеграцией с ЕСИА ../v2/ac: получение авторизационого кода. Помогите пожалуйста разобраться в ошибке подписи.
Редирект на url сформированный по лекалам КриптоПро .NET SDK, возвращает ошибку
error_description=ESIA-007053%3A+OAuthErrorEnum.clientSecretWrong&state=0270be29-eac7-4943-ad23-f46887a60661&error=access_denied

Ответ от Федерального ситуационного центра <sd@sc.digital.gov.ru>
По Вашему обращению сообщаем: ошибка возникает по причине некорректного формирования подписи запроса. Порядок формирования параметра и пример реализации описаны в разделе "В.2.5 Получение маркера доступа в обмен на авторизационный код (v3/te)" Методических рекомендаций по использованию ЕСИА (https://digital.gov.ru/ru/documents/6186/).


client_certificate_hash формируется по средством команды
Цитата:
cpverify.exe certName.cer -mk -alg GR3411_2012_256 -inverted_halfbytes 0


Код реализации AuthRedirectUrl
Цитата:

public string BuildEsiaAuthPageUri()
{
State = Guid.NewGuid().ToString("D");

var timestamp = DateTime.UtcNow.ToString("yyyy.MM.dd HH:mm:ss +0000");
var scope = RemoveWhitespace(EsiaSettings.Scope);
var msg = $"{EsiaSettings.ClientId}{scope}{timestamp}{State}{EsiaSettings.RedirectUri}";

var clientSecret = Sign(msg);

var builder = new RequestBuilder();
builder.AddParam("client_secret", clientSecret);
builder.AddParam("client_id", EsiaSettings.ClientId);
builder.AddParam("scope", EsiaSettings.Scope);
builder.AddParam("timestamp", timestamp);
builder.AddParam("state", State);
builder.AddParam("redirect_uri", EsiaSettings.RedirectUri);
builder.AddParam("client_certificate_hash", EsiaSettings.ClientCertificateHash);
builder.AddParam("response_type", "code");
builder.AddParam("access_type", "online");

//Вот тут самый важный момент на который было потрачено множество времени. Просто заменяем символы на безопасные
var url = EsiaEndpoints.EsiaAuthTestUrl + "?" + builder.ToString()
.Replace("+", "%2B")
.Replace(":", "%3A")
.Replace(" ", "+");
return url;
}


Код подписи сообщения
Цитата:

public string Sign(string msg)
{
var certificate = GetSignerCert();
var signature = SignGOST3411(certificate, Encoding.UTF8.GetBytes(msg));
return Base64UrlEncoder.Encode(signature);
}

private string SignGOST3411(X509Certificate2 certificate, byte[] data)
{
var gost3411 = new Gost3411_2012_256CryptoServiceProvider();
var hashValue = gost3411.ComputeHash(data);
gost3411.Clear();

var signedHash = GostSignHash(hashValue, certificate.PrivateKey as Gost3410_2012_256CryptoServiceProvider, "Gost3411_2012_256");
return Base64UrlEncoder.Encode(signedHash);
}

static byte[] GostSignHash(byte[] HashToSign, Gost3410_2012_256CryptoServiceProvider key, string HashAlg)
{
//Создаем форматтер подписи с закрытым ключом из переданного
//функции криптопровайдера.
Gost2012_256SignatureFormatter Formatter = new Gost2012_256SignatureFormatter(key);

//Устанавливаем хэш-алгоритм.
Formatter.SetHashAlgorithm(HashAlg);

//Создаем подпись для HashValue и возвращаем ее.
return Formatter.CreateSignature(HashToSign);
}


По итогу формируется следующий url
https://esia-portal1.tes...e&access_type=online
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.