Closed umbruxo closed 4 years ago
А вот тут я попробую помочь.
openssl pkcs12 -in ownsert.pfx -nokeys -out eisa.pem -engine gost
openssl pkcs12 -in ownsert.pfx -nocerts -out eisa.key -engine gost -nodes
Но ведь можно сделать ESIASigner для випнета и криптоПро? без танцев с бубном у заказчика с openssl? правильно я понимаю? Но это уже мы сами делаем? или есть может хорошее проверенное решение от разработчика библиотеки?
И как тогда доп вопрос быть с випнетом, который вообще не дает экспортировать закрытые ключи на Win10 в частности
Но ведь можно сделать ESIASigner для випнета и криптоПро?
Конечно можно.
И как тогда доп вопрос быть с випнетом, который вообще не дает экспортировать закрытые ключи на Win10 в частности
И с аппаратными токенами та же беда.
Но ведь можно сделать ESIASigner для випнета и криптоПро? без танцев с бубном у заказчика с openssl? правильно я понимаю? Но это уже мы сами делаем? или есть может хорошее проверенное решение от разработчика библиотеки?
Добрый день. Именно так, можно написать свою реализацию интерфейса IEsiaSigner, где использовать необходимый Вам поставщик криптографии. Мы у себя опробовали подпись только через OpenSSL (ЕСИА удовлетворяет самоподписанный сертификат неквалифицированной электронной подписи, чему мы были рады).
К сожалению, возможность использования КЭП для подписи запросов в ЕСИА мы пока не рассматривали. Знаю только, что у КриптоПРО в разработке есть форк библиотек .net core (https://github.com/CryptoPro/corefx), что в теории позволяет использовать встроенную в .NET Core криптографию без танцев с бубном, как это сейчас реализовано в КриптоПРО.Net. У ViPNet CSP не знаю, как с этим обстоят дела. Уточню в течение следующей недели у коллег.
К сожалению, возможность использования КЭП для подписи запросов в ЕСИА мы пока не рассматривали. Знаю только, что у КриптоПРО в разработке есть форк библиотек .net core (https://github.com/CryptoPro/corefx), что в теории позволяет использовать встроенную в .NET Core криптографию без танцев с бубном, как это сейчас реализовано в КриптоПРО.Net. У ViPNet CSP не знаю, как с этим обстоят дела. Уточню в течение следующей недели у коллег.
Есть обертка сторонняя для этих программ https://github.com/AlexMAS/GostCryptography
Не могу сростить никак https://github.com/AlexMAS/GostCryptography в .netcore Пишет, что алгоритм "1.2.643.7.1.1.2.2" не найден, Был опыт использования этой библиотеки в .netcore?
Пишет, что алгоритм "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.
Никак не могу заставить работать под виндой 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 пустой сразу. что не так?
если выполнить в командной строке 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
На Вин10 не работает, короче, подскажите как это сделать? Какой должен быть EsiaSigner Openssl для вин10?
cmd надо убрать и работать напрямую с openssl. Вот полностью рабочий код:
Не работает:
возвращается ошибка
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.
если же включаю: 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.
В настройках информационной системы на технологическом портале какой алгоритм для подписи указан?
гост 2012 256
На RS256 поменять надо.
но сертификат же гост. Это разве не оно там настраивается? Т.е. сертификат системы может быть гост, а в настройках указано RSA?
Это алгоритм формирования цифровой подписи от системы ЕСИА, а не наших запросов.
Наконец-то вроде заработало, спасибо!
В новой версии предполагается использовать файлы key и pem отдельно. Эти файлы не получается сделать из pfx файла КриптоПро. Как правильно подключить pfx сертификат в новой версии библиотеки?