yallie / MdlpClient

Честный знак. ИС «Маркировка». MDLP REST API Client
https://честныйзнак.рф/business/projects/medicines/documents/for_developers/
MIT License
22 stars 8 forks source link

ошибка подключения. #14

Closed Shtirlits1972 closed 4 years ago

Shtirlits1972 commented 4 years ago

Доброго дня! Пробую использовать Вашу библиотеку.

        GostCryptoHelpers.DefaultStoreLocation = StoreLocation.CurrentUser;

        MdlpClient client = new MdlpClient(credentials: new ResidentCredentials
        {
            ClientID = "39b7f3ed-719b-4deb-9f96-6a12bf1611c2",
            ClientSecret = "576f7780-b1ad-468c-94b0-4af45a152d16",
            UserID = "d5e50bffbb934104d269ea8d8540959cf8050659",

        }, baseUrl: "http://api.sb.mdlp.crpt.ru/api/v1/");

        client.Tracer = Console.WriteLine;

при этом выскакивает ошибка:

найден_сертификат

хотя, с этими же параметрами в Posmen-е удаётся получить код авторизации, а затем и токен, правда отработать запрос с токеном не получается :-( Get_code

не подскажете, в чём может быть проблема?

yallie commented 4 years ago

Добрый вечер! Судя по трассировке, URL неверный формируется.

Должен получиться http://api.sb.mdlp.crpt.ru/api/v1/auth, а в трассировке — http://api.sb.mdlp.crpt.ru/auth.

Вы уверены, что baseUrl у вас именно такой, как показан? В нем присутствует на конце этот кусок /api/v1?

Shtirlits1972 commented 4 years ago

Добрый вечер! Спасибо за помощь, поменял код, получилось авторизоватся, но возникла другая проблема. Вот собственно код:

        string client_id = ConfigurationManager.AppSettings["client_id"];
        string client_secret = ConfigurationManager.AppSettings["client_secret"];
        string user_id = ConfigurationManager.AppSettings["user_id"];

        GostCryptoHelpers.DefaultStoreLocation = StoreLocation.CurrentUser;

        MdlpClient client = new MdlpClient(credentials: new ResidentCredentials
        {
            ClientID = client_id,
            ClientSecret = client_secret,
            UserID = user_id,

        }, baseUrl: "http://api.sb.mdlp.crpt.ru/api/v1/");

        client.Tracer = Console.WriteLine;

        try
        {
            var info = client.GetRegions(0, 10);
            Console.WriteLine($"UserInfo: {info.ToJson()}");
        }

а вот скриншот с ошибкой: GetRegions

по трассировке видно, что токен получен успешно, но список регионов получить не удалось. Может это связано, с тем, что сертификат привязан к локальному юзеру, а не к компютеру? GostCryptoHelpers.DefaultStoreLocation = StoreLocation.CurrentUser; // без этого сертификат не находится.

yallie commented 4 years ago

В случае проблемы с сертификатом у вас бы и авторизоваться не получилось. Если авторизация прошла — значит, с сертификатом все в порядке.

От DefaultStoreLocation зависит только то, под каким пользователем нужно будет запускать ваш процесс. Если LocalMachine — то под админом, если CurrentUser — то будет работать и под обычным пользователем.

The underlying connection was closed — такое может быть, если у них сервер упал (что маловероятно). Если проблема постоянно повторяется, думаю, это что-то с сетевыми настройками. Может, с файрволлом, может, с антивирусом. Тут я вряд ли смогу подсказать, в чем дело.

Я попробовал только что этот метод на тестовом компе — он нормально вызывается на Песочнице:

Трассировка вызова GetRegions на Песочнице ```txt // Authenticate -> POST https://api.sb.mdlp.crpt.ru/api/v1/auth headers: { X-ApiMethodName = Authenticate Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml Content-type = application/json } body: { "client_id": "22d12250-6cf3-4a87-b439-f698cfddc498", "client_secret": "3deb0ba1-26f2-4516-b652-931fe832e3ff", "user_id": "10E4921908D24A0D1AD94A29BD0EF51696C6D8DA", "auth_type": "SIGNED_CODE" } <- OK 200 (OK) https://api.sb.mdlp.crpt.ru/api/v1/auth timings: { started: 2020-07-11 14:03:40 elapsed: 0:00:00.234 } headers: { Connection = keep-alive X-XSS-Protection = 1; mode=block Pragma = no-cache X-Frame-Options = DENY X-Content-Type-Options = nosniff Strict-Transport-Security = max-age=15768000 Content-Length = 47 Cache-Control = no-cache, no-store, max-age=0, must-revalidate Content-Type = application/json Date = Sat, 11 Jul 2020 11:03:42 GMT Expires = 0 Server = nginx/1.17.2 } body: { "code": "2b5416f9-21de-45c0-bbb9-5a6fdd104bc7" } // GetToken -> POST https://api.sb.mdlp.crpt.ru/api/v1/token headers: { X-ApiMethodName = GetToken Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml Content-type = application/json } body: { "code": "2b5416f9-21de-45c0-bbb9-5a6fdd104bc7", "signature": "MIIJNwYJKoZIhvcNAQcCoIIJKDCCCSQCAQExDjAMBggqhQMHAQECAwUA....=" } <- OK 200 (OK) https://api.sb.mdlp.crpt.ru/api/v1/token timings: { started: 2020-07-11 14:03:41 elapsed: 0:00:00.312 } headers: { Connection = keep-alive X-XSS-Protection = 1; mode=block Pragma = no-cache X-Frame-Options = DENY X-Content-Type-Options = nosniff Strict-Transport-Security = max-age=15768000 Content-Length = 63 Cache-Control = no-cache, no-store, max-age=0, must-revalidate Content-Type = application/json Date = Sat, 11 Jul 2020 11:03:43 GMT Expires = 0 Server = nginx/1.17.2 } body: { "token": "187ec418-6b33-43bd-9709-654a88508768", "life_time": 60 } // GetRegions -> POST https://api.sb.mdlp.crpt.ru/api/v1/reestr/area/regions headers: { X-ApiMethodName = GetRegions Authorization = token 187ec418-6b33-43bd-9709-654a88508768 Accept = application/json, text/json, text/x-json, text/javascript, application/xml, text/xml Content-type = application/json } body: { "start_from": 0, "count": 10 } <- OK 200 (OK) https://api.sb.mdlp.crpt.ru/api/v1/reestr/area/regions timings: { started: 2020-07-11 14:03:40 elapsed: 0:00:00.938 } headers: { Transfer-Encoding = chunked Connection = keep-alive X-XSS-Protection = 1; mode=block Pragma = no-cache X-Frame-Options = DENY X-Content-Type-Options = nosniff Strict-Transport-Security = max-age=15768000 Cache-Control = no-cache, no-store, max-age=0, must-revalidate Content-Type = application/json;charset=UTF-8 Date = Sat, 11 Jul 2020 11:03:43 GMT Expires = 0 Server = nginx/1.17.2 } body: { "total": 95, "entries": [ { "title": "Российская Федерация", "code": "-1000000", "key": "00" }, { "title": "Дальневосточный ФО", "code": "8", "children": [ "28", "79", "41", "49", "25", "14", "65", "27", "87" ] }, { "title": "Сибирский ФО", "code": "7", "children": [ "04", "22", "03", "75", "38", "42", "24", "54", "55", "70", "17", "19" ] }, { "title": "Уральский ФО", "code": "6", "children": [ "74", "86", "72", "45", "66", "89" ] }, { "title": "Северо-Западный ФО", "code": "2", "children": [ "29", "35", "39", "10", "11", "47", "51", "83", "53", "60", "78" ] }, { "title": "Приволжский ФО", "code": "5", "children": [ "02", "43", "12", "13", "52", "56", "58", "59", "63", "64", "16", "18", "73", "21" ] }, { "title": "Центральный ФО", "code": "1", "children": [ "31", "32", "33", "36", "37", "40", "44", "46", "48", "77", "50", "57", "62", "67", "68", "69", "71", "76" ] }, { "title": "Южный ФО", "code": "3", "children": [ "01", "30", "34", "08", "23", "91", "61", "92" ] }, { "title": "Северо-Кавказский ФО", "code": "4", "children": [ "05", "06", "07", "09", "15", "26", "20" ] }, { "title": "Город Москва", "code": "45000000", "key": "77" } ] } ```
Shtirlits1972 commented 4 years ago

Прошу прощения, ещё один вопрос - только что отработал метод получения регионов, но странное дело он отработал, только после того, как я запустил fiddler, что-бы посмотреть, почему же не проходят запросы.

Вот ошибка, кторую выдаёт fiddler: fiddler

Не могли бы вы подсказать, что нужно сделать, что-бы программа работала без фиддлера? Заранее спасибо.

yallie commented 4 years ago

Я подозреваю, что это может быть связано с выбором между http и https-адресами. В Честном знаке некоторые методы для резидентов вызываются только через https endpoint. Причем ошибки сервер выдает крайне невразумительные (типа, Internal server error: end of stream). Возможно, это ваш случай.

Shtirlits1972 commented 4 years ago

Помогло игнорирование ошибок сертификатов:

client.Client.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;

тут client это:

                MdlpClient client = new MdlpClient(credentials: new ResidentCredentials
                {
                    ClientID = client_id,
                    ClientSecret = client_secret,
                    UserID = user_id

                }, baseUrl: strBaseUrl);

Оставлю это здесь, может кому-нибудь поможет. Ещё раз спасибо за отличную библиотеку и за помощь в решении вопроса.

yallie commented 4 years ago

Ага, спасибо!

Я так понимаю, можно еще добавить сертификат тестового УЦ КриптоПро в доверенные. Судя по скриншоту, сертификат самой Песочницы подписан CRYPTO-PRO Test Center 2. Для работы с тестовыми УКЭП этот сертификат все равно придется добавить в доверенные.

Shtirlits1972 commented 4 years ago

Сертификат песочницы подписан другой организацией. Добавление её сертификата (сертификата издателя песочницы), а также добавление сертификата CryptoPro в доверенные положительных результатов не дали.