Esia 007005 ошибка что делать

Настраиваем авторизацию сайта через ЕСИА.

Проблема: После перехода по сформированной ссылке с подписью переходим на страницу авторизации, вводим данные, получаем ошибку «Ошибка авторизации», в адресе страницы есть подробности

error_description=ESIA-007005%3A+The+client+is+not+authorized+to+request+an+access+token+using+this+method

Имеется машина с докером.

Установлен докер контейнер https://hub.docker.com/r/required/cryptopro

Установлен корневой сертификат, сертификат клиента, стоит пробный ключ для КриптоПро.

Цепочки сертификатов проверены методом копирования (https://www.altlinux.org/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%9F%D1%80%D0%BE#%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D1%86%D0%B5%D0%BF%D0%BE%D1%87%D0%BA%D0%B8_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D0%B2)

cryptcp -copycert -thumbprint "$thumbprint" -df tt.cer

На выходе

Certificate chains are checked

Для ЕСИА требуется подпись в формате PKCS#7 detached signature в кодировке UTF8, затем кодированная в url safe base64

Погуглив, нашел такой вариант:

csptest -sfsign -sign -detached -base64 -add -alg "GOST12_256" -in message -out sig

Файл подписывается, проверяю

csptest -sfsign -verify -detached -base64 -add -alg "GOST12_256" -in message -signature sig

На выходе:

Detached Signature was verified OK

Вопрос — в чем может быть проблема? Куда копать?

UPD: Есть сервис, который умеет подписывать этим же сертификатом, написан на Java и с его подписью ЕСИА авторизует. Сравнив нашу ссылку и ссылку сервиса — нашли отличия только в строке client_secret, то есть в подписи.

Получение данных об организациях возможно только при использовании offline-режима получения данных о пользователе. Этот процесс включает следующие шаги:

1. Проведение аутентификации пользователя с помощью offline-режима, по результатам которого у вызывающей системы будет следующая информация:

  • идентификатор (oid) организации, по которой необходимо получить детальную информацию. Для получения oid можно воспользоваться блоком о ролях пользователя (roles), который доступен при наличии разрешения «Просмотр списка организаций пользователя» (usr_org);
  • актуальное значение ключа доступа «scsToken».

2. Вызов специального сервиса ESIA-Bridge, позволяющего получить данные об организации. Для этого необходимо выполнить HTTP-запрос методом POST на адрес точки получения данных об организации (/blitz/bridge/organization). Особенности запроса:

  • в теле (body) запроса необходимо указать параметры “token” (значение актуального ключа доступа), “oid” (идентификатор организации) и “redirect_url” (адрес обработчика успешной аутентификации на стороне вызывающей системы);
  • в заголовке (http header) необходимо указать параметр “Content-Type” со значением “application/x-www-form-urlencoded”.

Пример запроса на получение данных об организации:

POST https://esia.client.testcase.ru/blitz/bridge/organization
Content-Type: application/x-www-form-urlencoded
token=MIrS8LUZNHHh-8gBjzoBbHaI5qvsCIF3I3qDjh7mOMif5L90z2SAYYO9UN2talPmqiavxzjfE5CpAhV4S2t_kWyV6UHqskUIIT1B-EFFJmLAYEYnUbuD60ehbydOJVYsGmrjvaLzSwY6oqI3GKxgZaROq-9qwafgw5bgSdjCI18NU_QJHr2oRzumxwTEbLO5QKeQNekSVZeM_71q8t7l8Lh8PonOFl9Kiz2__00HT73QKIi_alE6qdzytPeS0tv68bcRdiUU2w6pzW6oIyQ6EJgpdn6zj3ff2dPiJ9pJE0oOVqcgzQHdq7_1UezpFw9qoQPEJSpAGrIH5ewhG8__k8mtz_EASApmjK20stkBdqeyFS9s21unHDmlvd13yh7Fk0ijm0vWl_iNAeCai-H_tozj7YH65L8eXqiq5sdkl2HmQHiEPOwWsmS1JivjgdqGHiaqVEiu5oXT_fEm6hrFj7nsxeedDVUGJ14FBYGgGU_Sgpf5ql2rHrJyz9hVr3MR|MTQxODMxMjc2Mg|U0gxQVMxMjhDQkM|6dkboBYuF4Y7ZtlHztSkjg|4n9D_efCPLv3fFl_JLTz5YgENWc&oid=1000323157&redirect_url=http://localhost:9000/ofCb

Возможные варианты ответа ESIA-Bridge на такой запрос:

  • если ключ доступа не позволяет получить данные указанной организации, то в ответе содержится ссылка (link) с запросом для получения корректного ключа доступа. Пример ответа:
{
  “redirect” : {
     “link” : “/blitz/bridge/entrance?redirect_url=http://localhost:9000/ofCb&oids=1000323157&mode=offline&state=dfa6e47e-576b-460e-9476-ce9597415188“,
     “state” : “dfa6e47e-576b-460e-9476-ce9597415188"
  }
}

Все, что требуется системе, – направить браузер пользователя по ссылке из ответа, указав корректный hostname ESIA-Bridge. Переход по этой ссылке инициирует в ЕСИА получение разрешения на доступ к данной организации. После того, как пользователь даст разрешение, ESIA-Bridge вернет пользователя по адресу, указанному в redirect_url и поставит новую сессионную cookie с новым ключом доступа tokenSCS. Получив обновленный ключ доступа, система должна повторно вызвать сервис получения данных об организации.

  • если ключ доступа позволяет получить данные указанной организации, то в ответе будет получен json со следующими данными:
    • обновленный ключ доступа scsToken, при этом старый ключ перестает действовать;
    • сведения об организации согласно спецификациям ЕСИА.

    Пример ответа, содержащего в себе данные организации, ее сотрудников и филиалов:

    {
    "orgResponse": {
    "scsToken": "esMNcjW0qPQ51zcTMiI8w881PiaMUfHBdNGjLo0-V2Tu8U8NGbP86tVxDXeoPQIOyjiQwz2K4ml0ymIqajcvmxoEpOc7IVs-sux0QKS4GKWxAUFBhcB-odAZJVTS_Sl0oZB8Xn5rKJh2p3zS92v-JbMVWzwL0OS6LB58If0vLIu1gdgwqKq1ee7B7vSsc8te|MTUxMzk4MzQ5MA|U0gxQVMxMjhDQkM|ls9NJJklcIDvAtQr_DgZ0w|_7qL6n1KC_M5da77ohg03FRAxwQ",
    "organization": {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "8DF580E06129CA1190B283E6764D68ADD88CBDB9",
    "oid": 1000323157,
    "shortName": "ООО "РЕАК СОФТ"",
    "fullName": "ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "РЕАК СОФТ"",
    "type": "AGENCY",
    "ogrn": "1147746651733",
    "inn": "7715434658",
    "leg": "12200",
    "kpp": "771501001",
    "agencyTerRange": "00",
    "agencyType": "10.FED",
    "oktmo": "45359000",
    "contacts": {
    "stateFacts": [
    "hasSize"
    ],
    "size": 3,
    "eTag": "711FD22A0ADEA3FB05BEB780FF6E2B25F9BF39A1",
    "elements": [
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "326468E0BC693CE48B87646B758EE54FB0737010",
    "id": 14283140,
    "type": "OFX",
    "vrfStu": "NOT_VERIFIED",
    "value": "+7(342)2875843"
    },
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "3288F9165AD8A0C2D956DB8CA9B3799BD7CECE18",
    "id": 14283139,
    "type": "OPH",
    "vrfStu": "NOT_VERIFIED",
    "value": "+7(342)2409435*984398"
    },
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "BA3D328687D1538B7AFF0CC153E704738BC78253",
    "id": 14240474,
    "type": "OEM",
    "vrfStu": "NOT_VERIFIED",
    "value": "mvanin@reaxoft.ru"
    }
    ]
    },
    "addresses": {
    "stateFacts": [
    "hasSize"
    ],
    "size": 2,
    "eTag": "7B82EB88BCA0425E2BC3B6914AFC6F9D0702DF3B",
    "elements": [
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "5E2BA4DB9268FED5079B2F5B5463E9FFE3CC4E50",
    "id": 27443,
    "type": "OPS",
    "region": "Пермский",
    "city": "Пермь",
    "addressStr": "Пермский край, Пермь город, Комсомольский проспект",
    "countryId": "RUS",
    "zipCode": "614000",
    "street": "Комсомольский",
    "house": "31В",
    "flat": "37"
    },
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "8CA439D7A477D899C0E67E513B2B72C4B4F962E3",
    "id": 16378,
    "type": "OLG",
    "region": "г МОСКВА",
    "addressStr": "г МОСКВА,ул РИМСКОГО ",
    "countryId": "RUS",
    "zipCode": "127566",
    "street": "ул РИМСКОГО ",
    "house": "95",
    "flat": "36"
    }
    ]
    },
    "employees": {
    "stateFacts": [
    "LastPage",
    "FirstPage",
    "Paginated"
    ],
    "pageSize": 100,
    "pageIndex": 1,
    "elements": [
    {
    "stateFacts": [
    "EntityRoot"
    ],
    "eTag": "E7ECC603BCEC866C6ACD0738A077CA39BADA9EFA",
    "prnOid": 1000299331,
    "orgOid": 1000323157,
    "position": "Руководитель",
    "chief": true,
    "person": {
    "stateFacts": [
    "EntityRoot"
    ],
    "eTag": "5B64DACFE84502F3B4A73F66A3F4D07F23360ACB",
    "firstName": "Михаил",
    "lastName": "Юрьев",
    "middleName": "Владимирович",
    "birthDate": "13.11.1981",
    "gender": "M",
    "citizenship": "RUS",
    "snils": "123-456-789 58",
    "inn": "123456789012",
    "updatedOn": 1492174836,
    "status": "REGISTERED",
    "verifying": false,
    "rIdDoc": 3303
    },
    "blocked": false
    },
    {
    "stateFacts": [
    "EntityRoot"
    ],
    "eTag": "D90F86B8FAE7DB8567D3679D97309AF821D5025D",
    "prnOid": 1000323269,
    "orgOid": 1000323157,
    "chief": false,
    "person": {
    "stateFacts": [
    "EntityRoot"
    ],
    "eTag": "CBB725A26583BBD55980751FAE85FAD2BC828833",
    "firstName": "Петр",
    "lastName": "Петров",
    "middleName": "Петрович",
    "birthDate": "11.11.1981",
    "birthPlace": "Москва",
    "gender": "M",
    "citizenship": "RUS",
    "snils": "000-333-444 39",
    "updatedOn": 1513856314,
    "status": "REGISTERED",
    "verifying": false
    },
    "blocked": false
    },
    {
    "stateFacts": [
    "EntityRoot"
    ],
    "eTag": "48C5A569574766A15287584DC057897BF20B9BF5",
    "prnOid": 1000348301,
    "orgOid": 1000323157,
    "chief": false,
    "person": {
    "stateFacts": [
    "EntityRoot"
    ],
    "eTag": "3A4A8EA83413C3076B34485561BB6FDE518C58D8",
    "firstName": "Семен",
    "lastName": "Иванов",
    "middleName": "Петрович",
    "birthDate": "14.03.1996",
    "birthPlace": "Москва",
    "gender": "M",
    "trusted": true,
    "citizenship": "RUS",
    "snils": "000-555-444 39",
    "inn": "520791835020",
    "updatedOn": 1513937119,
    "status": "REGISTERED",
    "verifying": false,
    "rIdDoc": 38957
    },
    "blocked": false
    }
    ]
    },
    "branches": {
    "stateFacts": [
    "LastPage",
    "FirstPage",
    "Paginated"
    ],
    "pageSize": 100,
    "pageIndex": 1,
    "eTag": "B854C2B28B54083C063C9319950B148A1D87EDCB",
    "elements": [
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "BDD1049E273023D50516686F7FF4CD14CC938150",
    "brhOid": 1000355069,
    "name": "Московский",
    "kpp": "435354354",
    "leg": "30002",
    "contacts": {
    "stateFacts": [
    "hasSize"
    ],
    "size": 3,
    "eTag": "BB7C4789C938FBF59F60744EC31215239D20B94F",
    "elements": [
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "5649E98457FAD7C4B38B091EABAAE497D7C24666",
    "id": 14283146,
    "type": "OEM",
    "vrfStu": "NOT_VERIFIED",
    "value": "test@example.com"
    },
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "E3B691F0DC97A07F271F337EF6000F671299E1C6",
    "id": 14283149,
    "type": "OPH",
    "vrfStu": "NOT_VERIFIED",
    "value": "+7(495)8736847*684764"
    },
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "D3A1E4715F456DD2D54544E387B6159DB6E486D4",
    "id": 14283150,
    "type": "OFX",
    "vrfStu": "NOT_VERIFIED",
    "value": "+7(499)9990930"
    }
    ]
    },
    "addresses": {
    "stateFacts": [
    "hasSize"
    ],
    "size": 1,
    "eTag": "8051E7E5247D83DEBFA5FFAC9410C81D1E5E1597",
    "elements": [
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "EC676F9CDB0F1344A8EED5444A8CC0DEB98D994C",
    "id": 27445,
    "type": "OPS",
    "region": "Москва",
    "addressStr": "Москва город, Московско-Минской Дивизии площадь",
    "countryId": "RUS",
    "zipCode": "121096",
    "street": "Московско-Минской Дивизии",
    "house": "6",
    "flat": "67"
    }
    ]
    }
    },
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "9438AF6F3D163DFD6A258078BC3F77D337A44B3E",
    "brhOid": 1000355068,
    "name": "Дальневосточный",
    "kpp": "948745837",
    "leg": "30001",
    "contacts": {
    "stateFacts": [
    "hasSize"
    ],
    "size": 3,
    "eTag": "FBBF6052BCF619EF40E2B2D888DC294AB9776BDB",
    "elements": [
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "C725D7760632612B18CBEDE303ADBA8612340488",
    "id": 14283143,
    "type": "OEM",
    "vrfStu": "NOT_VERIFIED",
    "value": "none@example.com"
    },
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "8CE333D782D4D75A8600210BBB1E78F73B2EC5F4",
    "id": 14283145,
    "type": "OFX",
    "vrfStu": "NOT_VERIFIED",
    "value": "+7(34343)90586"
    },
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "69344CDC7A35BD367284CB119ED237D2DBA30590",
    "id": 14283144,
    "type": "OPH",
    "vrfStu": "NOT_VERIFIED",
    "value": "+7(343)3354654*235642"
    }
    ]
    },
    "addresses": {
    "stateFacts": [
    "hasSize"
    ],
    "size": 1,
    "eTag": "3786BD82486EF0DE78B9B4BF4594B00D5C660F3D",
    "elements": [
    {
    "stateFacts": [
    "Identifiable"
    ],
    "eTag": "E56F04079933C955AC0C24DC8DD5E1722F912224",
    "id": 27444,
    "type": "OPS",
    "region": "Хабаровский",
    "addressStr": "Хабаровский край, Николаевский район, Нижнее Пронге поселок, Школьная улица",
    "area": "Николаевский",
    "settlement": "Нижнее Пронге",
    "countryId": "RUS",
    "zipCode": "682444",
    "street": "Школьная",
    "house": "40"
    }
    ]
    }
    }
    ]
    }
    }
    }
    }

    После получения ответа рекомендуется сохранить данные обновленного ключа доступа scsToken. Это позволит в будущем обновить данные об организации, ее сотрудниках и филиалах в offline-режиме, т.е. без участия пользователя.

    Здравствуйте!
    Установил:
    КриптоПро CSP 5.0 для Windows
    КриптоПро .NET 1.0.7132.0 (NET-x64-rus.msi)
    КриптоПро .NET SDK 1.0.7132.0 (NETSDK-x64-rus.msi)
    Мне необходимо авторизовать пользователей на сайте через ESIA
    Пишу программу которая на вход получает строку типа:

    fullname birthdate2020.01.24 08:48:17 +0100MICC01565f8ba7023-fa2b-4365-901b-e6062d4d2933

    Мне эту строку нужно подписать чтоб использовать для формирования URL.
    В качестве примера взял:
    cpdn.cryptopro.ru/default.asp?url=content/cpnet/ht…
    Далее из байт я делаю base64 url safe. Получается URL типа: (base64 я обрезал для удобства просмотра)

    https://esia-portal1.test.gosuslugi.ru/aas/oauth2/ac?client_id=MICC01565&client_secret=MIIUjQYJKoZIhvcNAQcCoIIUfjCCFHoCAQExDjAMBggqhQMHAQECAgUAMAsGCSqGSIb3DQEHAaCCEKMwgggEMIIHsaADAgECAhEDTIvMesQM-oDpESJGsDMu_zAKBggqhQMHAQEDAjCCASgxIDAeBgkqhkiG9w0BCQEWEW9vYjUxQG1haWwub3JiLnJ1MRgwFgYFKoUDZAESDTEwNjU2MTIwMzI4OTIxGjAYBggqhQMDgQMBARIMMDA1NjEyMDQ1ODQwMQswCQYDVQQGEwJSVTEzMDEGA1UECAwqNTYg0J7RgNC10L3QsdGD0YDQs9GB0LrQsNGPINC-0LHQu9Cw0YHRgtGMMR0wGwYDVQQHDBTQsy4g0J7RgNC10L3QsdGD0YDQszExMC8GA1UECQwo0YPQuy4g0JzQsNGA0YjQsNC70LAg0JbRg9C60L7QstCwLCDQtC40MjEcMBoGA1UECgwT0JPQkdCj0JcgItCc0JjQkNCmIjEcMBoGA1UEAwwT0JPQkdCj0JcgItCc0JjQkNCmIjAeFw0xOTAzMTQwNjIyNTVaFw0yMDAzMTQwNjMyNTVaMIIBRzEgMB4GCSqGSIb3DQEJARYRb29iNTFAbWFpbC5vcmIucnUxGjAYBggqhQMDgQMBARIMMDA1NjEyMDQ1ODQwMRgwFgYFKoUDZAESDTdA5oHuDmvpS3Vy5mN6g2Xj&redirect_uri=https://pp.io/&scope=fullname+birthdate&response_type=code&state=57b9ae3d-52a1-4f49-8b48-87c5d8784167&access_type=offline&timestamp=2020.01.24+08:56:58++0100

    При переходе по данной ссылке ESIA мне возвращает:
    error_description: ESIA-007005: The client is not authorized to request an access token using this method.
    state: 57b9ae3d-52a1-4f49-8b48-87c5d8784167
    error: unauthorized_client
    Может я взял не тот пример для подписи?
    Заранее большое спасибо!

    Форум КриптоПро
     » 
    Средства криптографической защиты информации
     » 
    КриптоПро .NET
     » 
    ESIA-007005 Подключение к ЕСИА ГОСТ 3410 сертификата (.NET Core web app)


    Offline

    Aifar

     


    #1
    Оставлено
    :

    11 апреля 2022 г. 16:55:34(UTC)

    Aifar

    Статус: Участник

    Группы: Участники

    Зарегистрирован: 11.04.2022(UTC)
    Сообщений: 11

    Сказал(а) «Спасибо»: 2 раз
    Поблагодарили: 1 раз в 1 постах

    Здравствуйте
    Пытаюсь подключить к .NET Core web app аутентификацию через госуслуги и новым ГОСТ 3410 сертификатом
    Подключил исправленный dotnet из https://github.com/Crypt…b/master/docs/Windows.md
    Создаю запрос для получения code с госуслуг, чтобы потом получить маркер доступа и остальное; отправляю на https://esia-portal1.tes…suslugi.ru/aas/oauth2/ac

    Нужен client_secret:
    вот выписка из их методических указаний
    <client_secret> – подпись запроса в формате PKCS#7 detached signature в кодировке UTF-8. Содержимое проверено (scope, date,..)

    Пробовал и SignCms:

    Код:

    var signedCms = new SignedCms(new ContentInfo(msg), true);
    var cmsSigner = new CmsSigner(Options.ClientCertificate);
    signedCms.ComputeSignature(cmsSigner);
    return signedCms.Encode();

    И чтением из файла:

    Код:

    byte[] pfx = File.ReadAllBytes(@"MyCert.pfx");
    X509Certificate2 cert = new X509Certificate2(pfx, "1", X509KeyStorageFlags.CspNoPersistKeySet);
    Gost3410_2012_256 privateKey = cert.PrivateKey as Gost3410_2012_256;
    
    SignedCms signedCms = new SignedCms(new ContentInfo(msg), false);
    CmsSigner cmsSigner = new CmsSigner(SubjectIdentifierType.Unknown, cert, privateKey);
    
    signedCms.ComputeSignature(cmsSigner);
    
    return signedCms.Encode();
    

    Первый вопрос: правильно ли так подписывать?
    Потому что постоянно приходит ответ с
    unauthorized_client;Description=ESIA-007005: The client is not authorized to request an access token using this method.

    Да еще и в логах тестовой технологической среды записи:
    [2022-04-08 09:30:44,643] [ERROR] [tomcat-exec-18] [ru.atc.esia.aas.oauth2.server.service.impl.RequestServiceImpl] The system [ALTESTO] has no aas feature
    [2022-04-08 09:30:44,643] [ERROR] [tomcat-exec-18] [ru.atc.esia.aas.oauth2.server.service.impl.RequestServiceImpl] The client id [ALTESTO] has not been authenticated.

    ALTESTO — идентификатор тестовой информационной системы (мнемоника)

    Второй вопрос: Но что может означать «aas feature»?

    Буду благодарен любой помощи

    Сертификат — усиленный гост 3410 с удостоверяющего центра. Но и с самоподписанным из DotnetCoreSampleProject ошибка не меняется

    Отредактировано пользователем 11 апреля 2022 г. 17:01:53(UTC)
     | Причина: добавлена информация о сертификатах, изменен заголовок


    Вверх


    Offline

    Aifar

     


    #2
    Оставлено
    :

    6 мая 2022 г. 9:03:42(UTC)

    Aifar

    Статус: Участник

    Группы: Участники

    Зарегистрирован: 11.04.2022(UTC)
    Сообщений: 11

    Сказал(а) «Спасибо»: 2 раз
    Поблагодарили: 1 раз в 1 постах

    1. Подписывание правильное
    2. Никто не знает. Путем штудирования методических указаний и справок выяснилось, что по заявке регистрации нас зарегистрировали у пользователя EsiaTest006@yandex.ru и дополнительно другую тестовую ИС на тестовом технологическом портале создавать не надо. Как только настроили нашу ИС (загрузили сертификаты, указали редирект урлы) смогли получить код авторизации.

    Только теперь падает в исключении при отправке запроса маркера доступа на https://esia-portal1.tes…suslugi.ru/aas/oauth2/te

    Win32Exception: Предоставленный функции токен неправилен
    System.Net.Security.SecureChannel.CreateFatalHandshakeAlertToken(SslPolicyErrors sslPolicyErrors, X509Chain chain)
    System.Net.Security.SecureChannel.VerifyRemoteCertificate(RemoteCertValidationCallback remoteCertValidationCallback, ref ProtocolToken alertToken)

    Казалось бы просто ошибка проверки удаленного сертификата — сохраняешь с сайта сертификат, добавляешь в доверенные центры сертификации, но нет. Все равно падает.


    Вверх


    Offline

    two_oceans

     


    #3
    Оставлено
    :

    6 мая 2022 г. 9:59:37(UTC)

    two_oceans

    Статус: Эксперт

    Группы: Участники

    Зарегистрирован: 05.03.2015(UTC)
    Сообщений: 1,598
    Российская Федерация
    Откуда: Иркутская область

    Сказал(а) «Спасибо»: 110 раз
    Поблагодарили: 389 раз в 364 постах

    Автор: Aifar Перейти к цитате

    Казалось бы просто ошибка проверки удаленного сертификата — сохраняешь с сайта сертификат, добавляешь в доверенные центры сертификации, но нет. Все равно падает.

    Если сертификат сайта не самоподписанный, то ой! В доверенные надо будет добавить не сам сертификат сайта, а сертификат УЦ, выдавшего сертификат сайта. Впрочем и после этого возможны нюансы — например, сертификат на один домен, а отвечает с эти сертификатом сайт на другом домене.


    Вверх


    Offline

    Aifar

     


    #4
    Оставлено
    :

    6 мая 2022 г. 12:41:18(UTC)

    Aifar

    Статус: Участник

    Группы: Участники

    Зарегистрирован: 11.04.2022(UTC)
    Сообщений: 11

    Сказал(а) «Спасибо»: 2 раз
    Поблагодарили: 1 раз в 1 постах

    Автор: two_oceans Перейти к цитате

    Автор: Aifar Перейти к цитате

    Казалось бы просто ошибка проверки удаленного сертификата — сохраняешь с сайта сертификат, добавляешь в доверенные центры сертификации, но нет. Все равно падает.

    Если сертификат сайта не самоподписанный, то ой! В доверенные надо будет добавить не сам сертификат сайта, а сертификат УЦ, выдавшего сертификат сайта. Впрочем и после этого возможны нюансы — например, сертификат на один домен, а отвечает с эти сертификатом сайт на другом домене.

    Нашел в сертификате ссылку на их УЦ, скачал их сертификат, поставил. Не сильно помогло.

    Также падает:

    Код:

    Win32Exception: Предоставленный функции токен неправилен
    System.Net.Security.SecureChannel.CreateFatalHandshakeAlertToken(SslPolicyErrors sslPolicyErrors, X509Chain chain)
    System.Net.Security.SecureChannel.VerifyRemoteCertificate(RemoteCertValidationCallback remoteCertValidationCallback, ref ProtocolToken alertToken)
    System.Net.Security.SslStream.CompleteHandshake(ref ProtocolToken alertToken)
    System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
    System.Net.Security.SslStream.StartSendBlob(byte[] incoming, int count, AsyncProtocolRequest asyncRequest)
    System.Net.Security.SslStream.ProcessReceivedBlob(byte[] buffer, int count, AsyncProtocolRequest asyncRequest)
    System.Net.Security.SslStream.StartReadFrame(byte[] buffer, int readBytes, AsyncProtocolRequest asyncRequest)
    System.Net.Security.SslStream.StartReceiveBlob(byte[] buffer, AsyncProtocolRequest asyncRequest)
    System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
    System.Net.Security.SslStream.StartSendBlob(byte[] incoming, int count, AsyncProtocolRequest asyncRequest)
    System.Net.Security.SslStream.ProcessReceivedBlob(byte[] buffer, int count, AsyncProtocolRequest asyncRequest)
    System.Net.Security.SslStream.StartReadFrame(byte[] buffer, int readBytes, AsyncProtocolRequest asyncRequest)
    System.Net.Security.SslStream.PartialFrameCallback(AsyncProtocolRequest asyncRequest)
    System.Net.Security.SslStream.ThrowIfExceptional()
    System.Net.Security.SslStream.InternalEndProcessAuthentication(LazyAsyncResult lazyResult)
    System.Net.Security.SslStream.EndProcessAuthentication(IAsyncResult result)
    System.Net.Security.SslStream.EndAuthenticateAsClient(IAsyncResult asyncResult)
    System.Net.Security.SslStream+<>c.<AuthenticateAsClientAsync>b__65_1(IAsyncResult iar)
    System.Threading.Tasks.TaskFactory<TResult>.FromAsyncCoreLogic(IAsyncResult iar, Func<IAsyncResult, TResult> endFunction, Action<IAsyncResult> endAction, Task<TResult> promise, bool requiresSynchronization)
    System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)

    Должны ли запросы отправляться с сервера у которого тоже действительный сертификат? У меня сейчас Kestrel с самоподписанным для https стоит

    Отредактировано пользователем 6 мая 2022 г. 12:43:02(UTC)
     | Причина: Не указана


    Вверх


    Offline

    Aifar

     


    #5
    Оставлено
    :

    6 мая 2022 г. 16:15:53(UTC)

    Aifar

    Статус: Участник

    Группы: Участники

    Зарегистрирован: 11.04.2022(UTC)
    Сообщений: 11

    Сказал(а) «Спасибо»: 2 раз
    Поблагодарили: 1 раз в 1 постах

    Сертификаты не помогли.
    Решил пока проверку полностью убрать. Ошибки проверки удаленного сертификата проверятся не будут.

    Сделал по примеру из https://stackoverflow.co…could-not-be-established

    Просто добавил в конструктор

    Код:

    
    httpClientHandler = new HttpClientHandler();
    httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) =>
    {
    	return true;
    };
    
    httpClient = new HttpClient(httpClientHandler) { BaseAddress = null };
    


    Вверх

    Пользователи, просматривающие эту тему

    Guest

    Форум КриптоПро
     » 
    Средства криптографической защиты информации
     » 
    КриптоПро .NET
     » 
    ESIA-007005 Подключение к ЕСИА ГОСТ 3410 сертификата (.NET Core web app)

    Быстрый переход
     

    Вы не можете создавать новые темы в этом форуме.

    Вы не можете отвечать в этом форуме.

    Вы не можете удалять Ваши сообщения в этом форуме.

    Вы не можете редактировать Ваши сообщения в этом форуме.

    Вы не можете создавать опросы в этом форуме.

    Вы не можете голосовать в этом форуме.

    Настраиваем авторизацию сайта через ЕСИА.

    Проблема: После перехода по сформированной ссылке с подписью переходим на страницу авторизации, вводим данные, получаем ошибку «Ошибка авторизации», в адресе страницы есть подробности

    error_description=ESIA-007005%3A+The+client+is+not+authorized+to+request+an+access+token+using+this+method
    

    Имеется машина с докером.

    Установлен докер контейнер https://hub.docker.com/r/required/cryptopro

    Установлен корневой сертификат, сертификат клиента, стоит пробный ключ для КриптоПро.

    Цепочки сертификатов проверены методом копирования (https://www.altlinux.org/%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%9F%D1%80%D0%BE#%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0_%D1%86%D0%B5%D0%BF%D0%BE%D1%87%D0%BA%D0%B8_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D0%B2)

    cryptcp -copycert -thumbprint "$thumbprint" -df tt.cer
    

    На выходе

    Certificate chains are checked
    

    Для ЕСИА требуется подпись в формате PKCS#7 detached signature в кодировке UTF8, затем кодированная в url safe base64

    Погуглив, нашел такой вариант:

    csptest -sfsign -sign -detached -base64 -add -alg "GOST12_256" -in message -out sig
    

    Файл подписывается, проверяю

    csptest -sfsign -verify -detached -base64 -add -alg "GOST12_256" -in message -signature sig
    

    На выходе:

    Detached Signature was verified OK
    

    Вопрос — в чем может быть проблема? Куда копать?

    UPD: Есть сервис, который умеет подписывать этим же сертификатом, написан на Java и с его подписью ЕСИА авторизует. Сравнив нашу ссылку и ссылку сервиса — нашли отличия только в строке client_secret, то есть в подписи.

    Форум КриптоПро
     » 
    Общие вопросы
     » 
    Общие вопросы
     » 
    ЕСИА версия 2.90, код авторизации


    Offline

    foke

     


    #1
    Оставлено
    :

    31 мая 2022 г. 22:02:42(UTC)

    foke

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

    Группы: Участники

    Зарегистрирован: 31.05.2022(UTC)
    Сообщений: 1

    Здравствуйте.
    В версии ЕСИА 2.90 депрекейтнули эндпоинт для получения кода авторизации /aas/oauth2/ac. Новая версия: /aas/oauth2/v2/ac.

    Изменилось описание формирования параметра client_secret.

    До версии 2.90:

    Цитата:

    <client_secret> – подпись запроса в формате PKCS#7 detached signature в кодировке UTF-
    8 от значений четырех параметров HTTP–запроса: scope, timestamp, clientId, state (без
    разделителей). <client_secret> должен быть закодирован в формате base64 url safe

    Версия 2.90:

    Цитата:

    <client_secret> — подпись значений пяти параметров в кодировке UTF-8:
    client_id, scope, timestamp, state, redirect_uri.
    конкатенировать вышеуказанные параметры;
    подписать полученную строку с использованием алгоритма подписания data hash с
    использованием механизмов КриптоПРО CSP и сертификата информационной
    системы;
    закодировать полученное значение в URL Safe Base64.

    В версии <2.90 с «подпись запроса в формате PKCS#7 detached signature» разобрались, работает.

    В версии 2.90 неясно, что такое «подписать полученную строку с использованием алгоритма подписания data hash с использованием механизмов КриптоПРО CSP»?
    Формулировка весьма расплывчатая, на мой взгляд.
    Должен ли измениться код формирования подписи?
    «data hash» — это название алгоритма?
    Есть ли рабочий java-код под эту задачу?

    Использование прежнего java-кода формирования подписи параметра client_secret (с учётом прочих обновлений параметров, описанных в инструкции) приводит к ошибке «ESIA-007005: The client is not authorized to request an access token using this method.», что по моему опыту соответствует некорректно сформированному client_secret.

    На данный момент сгенерированный url получения кода авторизации выглядит следующим образом:

    Цитата:

    https://esia-portal1.test.gosuslugi.ru/aas/oauth2/v2/ac
    ?client_id=MY-SYSTEM
    &client_certificate_hash=последовательность-64-символа
    &scope=fullname%20gender%20birthdate%20birthplace%20birth_cert_doc%20contacts%20inn%20snils%20residence_doc%20temporary_residence_doc%20id_doc%20temporary_residence_doc
    &response_type=code
    &access_type=offline
    &client_secret=последовательность-4-тысячи-символов
    &state=265133f8-0aaf-4c7a-89e2-b50fc6e0318a
    &timestamp=2022.05.31+23%3A10%3A39+%2B0400
    &redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Flogin%2Foauth2%2Fcode%2Fesia

    Отредактировано пользователем 31 мая 2022 г. 22:15:29(UTC)
     | Причина: Не указана


    Вверх


    Offline

    saaremaa

     


    #2
    Оставлено
    :

    6 июля 2022 г. 13:50:13(UTC)

    saaremaa

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

    Группы: Участники

    Зарегистрирован: 06.07.2022(UTC)
    Сообщений: 1
    Российская Федерация

    У вас получилось что-нибудь с получением кода авторизации? Тоже зависли на этом моменте и не знаем куда двигаться. Поддержка Минцифры только пересылает отрывки из методички.

    Дополнение от 07.07.2022:

    Цитата:

    К Вашему запросу SCR#2946679 добавлен комментарий:

    Добрый день!

    По Вашему обращению сообщаем, что при формировании client_secret необходимо использовать следующие алгоритмы шифрования:
    GOST3411_2012_256withGOST3410_2012_256;
    GOST3411_2012_512withGOST3410_2012_512:
    GOST3411withGOST3410EL .

    Кто добавил: СКУФ Служебный/ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО «РОСТЕЛЕКОМ»

    после формирования подписи с помощью GOST3411_2012_256withGOST3410_2012_256 получили корректный client_secret

    Библиотеки на языке Golang: https://github.com/Theo730/gogost
    Описание: http://www.gogost.cypherpunks.ru/

    Отредактировано пользователем 7 июля 2022 г. 13:01:22(UTC)
     | Причина: Не указана


    Вверх


    Offline

    two_oceans

     


    #3
    Оставлено
    :

    8 июля 2022 г. 8:06:58(UTC)

    two_oceans

    Статус: Эксперт

    Группы: Участники

    Зарегистрирован: 05.03.2015(UTC)
    Сообщений: 1,598
    Российская Федерация
    Откуда: Иркутская область

    Сказал(а) «Спасибо»: 110 раз
    Поблагодарили: 389 раз в 364 постах

    Автор: saaremaa Перейти к цитате

    По Вашему обращению сообщаем, что при формировании client_secret необходимо использовать следующие алгоритмы шифрования:
    GOST3411_2012_256withGOST3410_2012_256;
    GOST3411_2012_512withGOST3410_2012_512:
    GOST3411withGOST3410EL .

    Добрый день. Сначала конечно замечание, что не шифрования, а подписания, так как в сообщениях выше процитированы места, где ясно говорится «подпись», «подписать».
    1) Если перевести идентификаторы на человекопонятный язык, то это ГОСТ-2012 (256 и 512 бит), ГОСТ-2001. Насчет актуальности последнего весьма сомнительно, так как сертификаты гост-2001 уже должны были все закончиться. Для вышеуказанных идентификаторов нужно на подписание передавать сами данные, а не вычисленный заранее хэш.
    2) Если речь про PKCS#7, то там нет проблемы с порядком байтов, все определено в стандарте. Если же речь про RawSignature, то стандарт не определяет порядок байт, может понадобится «переворачивать/отзеркалить» значение хэша и/или подписи (первый байт с последним, второй с предпоследним и т.д) до кодирования BASE64, так как указанные идентификаторы без слова «CryptoPro», что подразумевает порядок байт Big Endian. Обычно достаточно перевернуть значение подписи. В то же время есть идентификаторы гост-2012 со словом «CryptoPro», которые подразумевает порядок байт Little Endian — то есть переворотов не нужно.
    3) Важно также не забывать, что URL Safe Base64 не то же самое, что BASE64, нужно заменить ряд символов, имеющих специальное значение в URL.

    Что же до указанной ссылки на библиотеку Го, похоже на несертифицированное решение с самостоятельной реализацией криптографических примитивов. Для тестов с тестовыми ключами конечно никто Вам ничего особо не скажет. Используя же несертифицированное решение с гитхаба в продакшене с «боевыми» ключами, Вы принимаете на себя риски возможных штрафов за неправильное обращение со СКЗИ и ключевой информацией. Будьте бдительны, не все работающие решения можно использовать по закону.


    Вверх


    Offline

    forumname

     


    #4
    Оставлено
    :

    23 августа 2022 г. 9:44:46(UTC)

    forumname

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

    Группы: Участники

    Зарегистрирован: 23.08.2022(UTC)
    Сообщений: 1

    Автор: foke Перейти к цитате

    подписать полученную строку с использованием алгоритма подписания data hash с использованием механизмов КриптоПРО CSP

    Я правильно понимаю, что сначала вычисляем hash с помощью алгоритма GOST3411_2012_256, а потом подписываем вычисленное значение алгоритмом GOST3410_2012_256?

    Или нужно как-то иначе использовать механизмы КриптоПро CSP?


    Вверх


    Offline

    navrocky

     


    #5
    Оставлено
    :

    19 октября 2022 г. 13:52:15(UTC)

    navrocky

    Статус: Участник

    Группы: Участники

    Зарегистрирован: 19.10.2022(UTC)
    Сообщений: 10
    Российская Федерация

    Сказал(а) «Спасибо»: 2 раз
    Поблагодарили: 2 раз в 2 постах

    Вот рабочий код на Java для формирования client_secret с использованием крипто-провайдера BouncyCastle:

    Код:

    PrivateKey privateKey = ...;
    String joinedString = String.join("", clientId, scope, timeStamp, state, redirectUri);
    Signature signer = Signature.getInstance("GOST3411WITHECGOST3410-2012-256", new BouncyCastleProvider());
    signer.initSign(privateKey);
    signer.update(joinedString.getBytes());
    signature = signer.sign();
    String clientSecret = Base64.getUrlEncoder().encodeToString(signature);

    Отредактировано пользователем 19 октября 2022 г. 13:53:54(UTC)
     | Причина: Не указана


    Вверх

    thanks 1 пользователь поблагодарил navrocky за этот пост.

    JsutUser

    оставлено 11.11.2022(UTC)


    Offline

    EugeneNSK

     


    #6
    Оставлено
    :

    19 декабря 2022 г. 11:26:02(UTC)

    EugeneNSK

    Статус: Участник

    Группы: Участники

    Зарегистрирован: 25.11.2020(UTC)
    Сообщений: 13
    Российская Федерация
    Откуда: NSK

    Сказал(а) «Спасибо»: 2 раз

    Автор: navrocky Перейти к цитате

    Вот рабочий код на Java для формирования client_secret с использованием крипто-провайдера BouncyCastle:

    Код:

    PrivateKey privateKey = ...;
    String joinedString = String.join("", clientId, scope, timeStamp, state, redirectUri);
    Signature signer = Signature.getInstance("GOST3411WITHECGOST3410-2012-256", new BouncyCastleProvider());
    signer.initSign(privateKey);
    signer.update(joinedString.getBytes());
    signature = signer.sign();
    String clientSecret = Base64.getUrlEncoder().encodeToString(signature);

    Тоже столкнулся с проблемой формирования client_secret при получении кода доступа (через v2/ac).
    Подпись действительно стала сырой.
    Приведенный выше код рабочий.

    Для JCP/JCSP использую:

    Код:

    String joinedString = String.join("", clientId, scope, timeStamp, state, redirectUri);
    AlgorithmDetails algorithmDetails = new AlgorithmDetails(privateKey.getAlgorithm());
    Signature signature = Signature.getInstance(algorithmDetails.getSignAlgorithm(), provider);
    signature.initSign(privateKey);
    signature.update(joinedString.getBytes());
    byte[] result = signature.sign();
    String clientSecret = new String(Base64.getUrlEncoder().encode(result), StandardCharsets.UTF_8);


    Вверх


    Offline

    dzibzeev

     


    #7
    Оставлено
    :

    29 марта 2023 г. 17:25:28(UTC)

    dzibzeev

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

    Группы: Участники

    Зарегистрирован: 28.03.2023(UTC)
    Сообщений: 1
    Российская Федерация

    Коллеги!

    А у кого-нибудь получилось с использованием cryptcp -signf подписать секрет клиента для второй версии API(v2/ac) ЕСИА?

    Вот так мы сейчас создаем подпись для ЕСИА(код на go):

    command := exec.Command(s.cmd, «-signf»,
    «-der»,
    «-strict»,
    «-cert»,
    «-hashalg», s.hashAlgOID,
    «-detached»,
    «-thumbprint», s.thumbprint,
    «-pin», s.containerPIN,
    filename)

    С первой версией все прекрасно работает, с v2 не хочет работать. ЕСИА возвращает ошибку ESIA-007053: OAuthErrorEnum.clientSecretWrong


    Вверх


    Offline

    MESHOK

     


    #8
    Оставлено
    :

    21 июня 2023 г. 12:25:31(UTC)

    MESHOK

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

    Группы: Участники

    Зарегистрирован: 21.06.2023(UTC)
    Сообщений: 1
    Российская Федерация

    Находите имя своего ключа: csptest -keys -enum_cont -verifycontext -fqcn
    Подписываете строку: csptest -keys -cont ‘\.<хранилище><имя _контейнера>’ -sign GOST12_256 -in файл_с_данными -out файл_с_данными.sig -keytype exchange
    Прочитываете файл в бинарном виде и побайтово его переворачиваете. Например:
    Исходные данные: 68 65 6c 6c 6f
    Перевернутые данные: 6f 6c 6c 65 68
    Перевернутые данные кодируете в base64url — это и есть client_secret


    Вверх

    Пользователи, просматривающие эту тему

    Guest

    Форум КриптоПро
     » 
    Общие вопросы
     » 
    Общие вопросы
     » 
    ЕСИА версия 2.90, код авторизации

    Быстрый переход
     

    Вы не можете создавать новые темы в этом форуме.

    Вы не можете отвечать в этом форуме.

    Вы не можете удалять Ваши сообщения в этом форуме.

    Вы не можете редактировать Ваши сообщения в этом форуме.

    Вы не можете создавать опросы в этом форуме.

    Вы не можете голосовать в этом форуме.

  • Esf016 ошибка подключения к порталу ис эсф
  • Esf 63021 коды ошибок
  • Esf 63021 electrolux ошибки
  • Esf 45030 electrolux сброс ошибок
  • Eset сбой обновления модулей ошибка подключения к серверу