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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions