AISGorod / AISGorod.AspNetCore.Authentication.Esia

ESIA identity provider (middleware) for ASP.NET Core based on OpenID Connect.
MIT License
19 stars 6 forks source link

КриптоПро CSP pfx файлы. Проблема #11

Closed umbruxo closed 4 years ago

umbruxo commented 4 years ago

В новой версии предполагается использовать файлы key и pem отдельно. Эти файлы не получается сделать из pfx файла КриптоПро. Как правильно подключить pfx сертификат в новой версии библиотеки?

planar74 commented 4 years ago

А вот тут я попробую помочь.

  1. Ищем утилиту под названием P12FromGostCSP
  2. Устанавливаем сертификат и приватный ключ из исходного файла в систему.
  3. Запускаем утилиту, выбираем установленный сертификат и делаем другой pfx файл.
  4. Из файла, получившегося на предыдущем шаге выдергиваем сертификат командой openssl pkcs12 -in ownsert.pfx -nokeys -out eisa.pem -engine gost
  5. И приватный ключ openssl pkcs12 -in ownsert.pfx -nocerts -out eisa.key -engine gost -nodes
  6. (........)
  7. PROFIT!
umbruxo commented 4 years ago

Но ведь можно сделать ESIASigner для випнета и криптоПро? без танцев с бубном у заказчика с openssl? правильно я понимаю? Но это уже мы сами делаем? или есть может хорошее проверенное решение от разработчика библиотеки?

umbruxo commented 4 years ago

И как тогда доп вопрос быть с випнетом, который вообще не дает экспортировать закрытые ключи на Win10 в частности

planar74 commented 4 years ago

Но ведь можно сделать ESIASigner для випнета и криптоПро?

Конечно можно.

И как тогда доп вопрос быть с випнетом, который вообще не дает экспортировать закрытые ключи на Win10 в частности

И с аппаратными токенами та же беда.

vladdy-moses commented 4 years ago

Но ведь можно сделать ESIASigner для випнета и криптоПро? без танцев с бубном у заказчика с openssl? правильно я понимаю? Но это уже мы сами делаем? или есть может хорошее проверенное решение от разработчика библиотеки?

Добрый день. Именно так, можно написать свою реализацию интерфейса IEsiaSigner, где использовать необходимый Вам поставщик криптографии. Мы у себя опробовали подпись только через OpenSSL (ЕСИА удовлетворяет самоподписанный сертификат неквалифицированной электронной подписи, чему мы были рады).

К сожалению, возможность использования КЭП для подписи запросов в ЕСИА мы пока не рассматривали. Знаю только, что у КриптоПРО в разработке есть форк библиотек .net core (https://github.com/CryptoPro/corefx), что в теории позволяет использовать встроенную в .NET Core криптографию без танцев с бубном, как это сейчас реализовано в КриптоПРО.Net. У ViPNet CSP не знаю, как с этим обстоят дела. Уточню в течение следующей недели у коллег.

planar74 commented 4 years ago

К сожалению, возможность использования КЭП для подписи запросов в ЕСИА мы пока не рассматривали. Знаю только, что у КриптоПРО в разработке есть форк библиотек .net core (https://github.com/CryptoPro/corefx), что в теории позволяет использовать встроенную в .NET Core криптографию без танцев с бубном, как это сейчас реализовано в КриптоПРО.Net. У ViPNet CSP не знаю, как с этим обстоят дела. Уточню в течение следующей недели у коллег.

Есть обертка сторонняя для этих программ https://github.com/AlexMAS/GostCryptography

umbruxo commented 4 years ago

Не могу сростить никак https://github.com/AlexMAS/GostCryptography в .netcore Пишет, что алгоритм "1.2.643.7.1.1.2.2" не найден, Был опыт использования этой библиотеки в .netcore?

planar74 commented 4 years ago

Пишет, что алгоритм "1.2.643.7.1.1.2.2" не найден

Это алгоритм хэширования ГОСТ Р 34.11-2012, а нужно использовать алгоритм цифровой подписи ГОСТ Р 34.10-2012, oid "1.2.643.7.1.1.3.2" Может, проще все таки будет получить новый сертификат, откуда можно будет приватный ключ вытащить? У меня на openssl что под Windows, что под Linux все нормально работает.

З. Ы. не проснулся. Не знаю, если честно, не пробовал ее под Core.

umbruxo commented 4 years ago

Никак не могу заставить работать под виндой 10.

Process a = new Process(); a.StartInfo.FileName = @"C:\Program Files\OpenSSL-Win64\bin\openssl.exe"; a.StartInfo.Arguments = $" cms -sign -binary -stream -engine gost -inkey \"c:\Users\shurupov\Source\repos\TestLinuxWebApp\ESIA\esia.key\" -signer c:\Users\shurupov\Source\repos\TestLinuxWebApp\ESIA\esia.pem -nodetach -outform pem"; //a.StartInfo.Arguments = $" engine gost -c"; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { a.StartInfo.FileName = "cmd.exe"; a.StartInfo.Arguments = " /c \"C:\Program Files\OpenSSL-Win64\bin\openssl.exe\"" + a.StartInfo.Arguments; }

        a.StartInfo.RedirectStandardInput = true;
        a.StartInfo.RedirectStandardOutput = true;
        a.StartInfo.UseShellExecute = false;

        a.Start();
        a.StandardInput.Write(Encoding.UTF8.GetString(data)); // просто передавать массив байтов не получается - ломает подпись
        a.StandardInput.Close();

        StringBuilder resultData = new StringBuilder();
        bool isKeyProcessing = false;
        //string output = a.StandardOutput.ReadToEnd();
        while (!a.StandardOutput.EndOfStream)
        {
            string line = a.StandardOutput.ReadLine();
            if (line == "-----BEGIN CMS-----")
            {
                isKeyProcessing = true;
            }
            else if (line == "-----END CMS-----")
            {
                isKeyProcessing = false;
            }
            else if (isKeyProcessing)
            {
                resultData.Append(line);
            }
        }

outputStream пустой сразу. что не так?

umbruxo commented 4 years ago

если выполнить в командной строке openssl cms -sign -engine gost -inkey esia.key -signer esia.pem '123' то выведется только: и даже как будто не целиком болтается строка для ввода и пока не нажмешь Ctrl+C не выйдет из команды

engine "gost" set. MIME-Version: 1.0 Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg="gostr3411-2012-256"; boundary="----04E43EC13E193CC206C5F08490F6C3CD"

This is an S/MIME signed message

------04E43EC13E193CC206C5F08490F6C3CD

umbruxo commented 4 years ago

На Вин10 не работает, короче, подскажите как это сделать? Какой должен быть EsiaSigner Openssl для вин10?

planar74 commented 4 years ago

cmd надо убрать и работать напрямую с openssl. Вот полностью рабочий код:

Sign.zip

umbruxo commented 4 years ago

Не работает:

возвращается ошибка 11:39:35: Information AuthenticationScheme: Esia was challenged. 11:39:38: Error Exception occurred while processing message. 11:39:38: Information Error from RemoteAuthentication: IDX10503: Signature validation failed. Keys tried: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'. Exceptions caught: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'. token: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.. 11:39:38: Error An unhandled exception has occurred while executing the request. 11:39:38: Error RequestID: |92d3c237-483db7f3a7d9b57c. this /signin-oidc threw an exception System.Exception: An error was encountered while handling the remote login. ---> Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10503: Signature validation failed. Keys tried: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'. Exceptions caught: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'. token: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'. at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(String token, TokenValidationParameters validationParameters) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken) at Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.ValidateToken(String idToken, AuthenticationProperties properties, TokenValidationParameters validationParameters, JwtSecurityToken& jwt) at Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.HandleRemoteAuthenticateAsync() --- End of inner exception stack trace --- at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.HandleRequestAsync() at AISGorod.AspNetCore.Authentication.Esia.EsiaHandler.HandleRequestAsync() in C:\Users\shurupov\Source\repos\AISGorod.AspNetCore.Authentication.Esia-1.2.0\src\EsiaHandler.cs:line 46 at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)

если же включаю: IdentityModelEventSource.ShowPII = true; то вижу, что от есиа что- то возвратилось, но все равно ошибка:

11:54:33: Information Error from RemoteAuthentication: IDX10503: Signature validation failed. Keys tried: 'Microsoft.IdentityModel.Tokens.RsaSecurityKey, KeyId: '', InternalId: 'c9beda8f-d662-4ad8-aada-dc88bb4e4e38'. , KeyId: '. Exceptions caught: 'System.NotSupportedException: IDX10634: Unable to create the SignatureProvider. Algorithm: 'GOST3410_2012_256', SecurityKey: 'Microsoft.IdentityModel.Tokens.RsaSecurityKey, KeyId: '', InternalId: 'c9beda8f-d662-4ad8-aada-dc88bb4e4e38'.' is not supported. The list of supported algorithms is available here: https://aka.ms/IdentityModel/supported-algorithms at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateSignatureProvider(SecurityKey key, String algorithm, Boolean willCreateSignatures) at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateForVerifying(SecurityKey key, String algorithm) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(Byte[] encodedBytes, Byte[] signature, SecurityKey key, String algorithm, TokenValidationParameters validationParameters) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(String token, TokenValidationParameters validationParameters) '. token: '{"alg":"GOST3410_2012_256","ver":0,"typ":"JWT","sbt":"id"}.{"aud":"**","sub":246813022,"nbf":1597740873,"amr":"PWD","urn:esia:amd":"PWD","auth_time":1597740333,"iss":"http://esia.gosuslugi.ru/","urn:esia:sid":"077fa3f8bee4c3e6d772a87b8c586689d40cef01ab9362b7b0f118627fa1cc37","urn:esia:sbj":{"urn:esia:sbj:typ":"P","urn:esia:sbj:is_tru":true,"urn:esia:sbj:oid":246813022,"urn:esia:sbj:nam":"********"},"exp":1597751673,"iat":1597740873,"nonce":"637333376727125033.ZThhMjcwY2MtZDE3Yy00NDkyLThjNmMtMjY2NTc4MDM5NWVlNzY3OTVkNmQtYjRmYi00MTZkLWFjNjUtZDc5MzhlMGU4MzQ4"}'.. 11:54:33: Error An unhandled exception has occurred while executing the request. 11:54:33: Error RequestID: |60997af0-4a9a2f669609777e. this /signin-oidc threw an exception System.Exception: An error was encountered while handling the remote login. ---> Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10503: Signature validation failed. Keys tried: 'Microsoft.IdentityModel.Tokens.RsaSecurityKey, KeyId: '', InternalId: 'c9beda8f-d662-4ad8-aada-dc88bb4e4e38'. , KeyId: '. Exceptions caught: 'System.NotSupportedException: IDX10634: Unable to create the SignatureProvider. Algorithm: 'GOST3410_2012_256', SecurityKey: 'Microsoft.IdentityModel.Tokens.RsaSecurityKey, KeyId: '', InternalId: 'c9beda8f-d662-4ad8-aada-dc88bb4e4e38'.' is not supported. The list of supported algorithms is available here: https://aka.ms/IdentityModel/supported-algorithms at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateSignatureProvider(SecurityKey key, String algorithm, Boolean willCreateSignatures) at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateForVerifying(SecurityKey key, String algorithm) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(Byte[] encodedBytes, Byte[] signature, SecurityKey key, String algorithm, TokenValidationParameters validationParameters) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(String token, TokenValidationParameters validationParameters) '. token: '{"alg":"GOST3410_2012_256","ver":0,"typ":"JWT","sbt":"id"}.{"aud":"****","sub":246813022,"nbf":1597740873,"amr":"PWD","urn:esia:amd":"PWD","auth_time":1597740333,"iss":"http://esia.gosuslugi.ru/","urn:esia:sid":"077fa3f8bee4c3e6d772a87b8c586689d40cef01ab9362b7b0f118627fa1cc37","urn:esia:sbj":{"urn:esia:sbj:typ":"P","urn:esia:sbj:is_tru":true,"urn:esia:sbj:oid":246813022,"urn:esia:sbj:nam":"*********"},"exp":1597751673,"iat":1597740873,"nonce":"637333376727125033.ZThhMjcwY2MtZDE3Yy00NDkyLThjNmMtMjY2NTc4MDM5NWVlNzY3OTVkNmQtYjRmYi00MTZkLWFjNjUtZDc5MzhlMGU4MzQ4"}'. at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(String token, TokenValidationParameters validationParameters) at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken) at Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.ValidateToken(String idToken, AuthenticationProperties properties, TokenValidationParameters validationParameters, JwtSecurityToken& jwt) at Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.HandleRemoteAuthenticateAsync() --- End of inner exception stack trace --- at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.HandleRequestAsync() at AISGorod.AspNetCore.Authentication.Esia.EsiaHandler.HandleRequestAsync() in C:\Users\shurupov\Source\repos\AISGorod.AspNetCore.Authentication.Esia-1.2.0\src\EsiaHandler.cs:line 46 at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)

planar74 commented 4 years ago

В настройках информационной системы на технологическом портале какой алгоритм для подписи указан?

umbruxo commented 4 years ago

гост 2012 256

planar74 commented 4 years ago

На RS256 поменять надо.

umbruxo commented 4 years ago

но сертификат же гост. Это разве не оно там настраивается? Т.е. сертификат системы может быть гост, а в настройках указано RSA?

planar74 commented 4 years ago

Это алгоритм формирования цифровой подписи от системы ЕСИА, а не наших запросов.

umbruxo commented 4 years ago

Наконец-то вроде заработало, спасибо!