-
Notifications
You must be signed in to change notification settings - Fork 3
Description
Условие: для получения токена Госключа необходимо отправить запрос на https://esia-portal1.test.gosuslugi.ru/esia-rs/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 запрос получаем токен