Skip to content

Подпись сделанная с помощью dotnetcades не проходит проверку в API ЕСИА Госуслуг #3

@AlexTooleneff

Description

@AlexTooleneff

Условие: для получения токена Госключа необходимо отправить запрос на 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 запрос получаем токен

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions