Comments (14)
Поправьте меня, если я не прав. У вас есть некоторое Web-приложение, которое размещается на IIS. Для каждого пользователя этого приложения есть сертификат, который хранится в своем контейнере, со своим паролем доступа. При дешифрации пользователь (видимо, через Web-интерфейс) вводит пароль, который должен использоваться на стороне Web-приложения. То есть получается, что пароль в общем случае знает только конечный пользователь вашего Web-приложения. Все верно?
P.s. Я постараюсь в свободное время попробовать найти решение проблемы, просто хочется представлять понять суть проблемы.
from gostcryptography.
Может я что-то не до конца понимаю, но смотрите. Web-приложение, работающее на базе IIS, и CSP со всеми сертификатами физически находятся на одной машине (виртуальной или нет, не имеет значения). Хранить пароль контейнера в конфигурационном файле Web-приложения или на диске, используя средства CSP, в общем случае одно и тоже (суть одна - пароль будет сохранен на этой же машине, на постоянном носителе). Только в первом случае мы имеем проблему с диалоговым окном, а во втором - нет. Я полагаю, что проблема в том процесс вашего Web-приложения, будучи запущенным под управлением IIS, запускается от имени какой-то конкретной учетной записи. И, возможно, для нее пароль не сохранен (в понимании CSP). Попробуйте поэкспериментировать с "Параметрами доступа" (см. настройку на картинке выше ), например, добавив туда учетную запись, от имени которой работает процесс IIS. В общем, постарайтесь как-то через настройки CSP сохранить пароль для пользователя, от имени которого запускается ваше Web-приложение. Должно получиться.
P.s. Теорию можно проверить следующим образом. На своей машине установите CSP, сертификат и сохраните пароль. Запустите приложение из под IDE (или как-то из под своей учетной записи) и проверьте, что все работает нормально. После этого создайте новую учетную запись, зайдите под ней, запустите приложение из под IDE. (или как-то из под своей новой учетной записи). Должен появиться диалог. После этого сохраните пароль для новой учетной записи и повторите действия. Диалог должен пропасть.
from gostcryptography.
Добрый день, да, похоже такой вариант жизнеспособен. Но пришлось покопаться в IIS. Проблема состояла в том, что учетные записи IIS AppPool \ - это учетные записи «Идентификатор пула приложений», время жизни учетной записи ApplicationPoolIdentity полностью управляется IIS и ОС, и запустить под именем этой учетной записи VipNet CSP либо CryptoPro нельзя.
Пришлось создать нового пользователя и добавить в группу IIS_IUSRS, далее в IIS в дополнительных параметрах пула приложений, на котором было развернуто моё веб приложение (в моём случае DefaultAPPPool), изменил параметр "Удостоверение пула приложений" с встроенной учётной записи на "Особая учетная запись" с указанием созданного ранее пользователя. Соответственно после этих манипуляций я смог запустить VipNetCSP через runas и сохранить пароль для сертификата этого пользователя.
Благодарю, жаль, что так и не удалось разобраться, как это провернуть программно.)
from gostcryptography.
Здравствуйте.
Если я правильно помню, то сделать это можно примерно так:
// Получение параметров криптопровайдера по сертификату
var cspParameters = X509CertificateHelper.GetPrivateKeyInfo(Certificate);
// Запрет вывода окна ввода пароля, при неправильном пароле получить ошибку
cspParameters.Flags = CspProviderFlags.NoPrompt;
// Создание строки с паролем (пример: Qwerty123)
var password = new SecureString();
password.AppendChar('Q');
password.AppendChar('w');
password.AppendChar('e');
password.AppendChar('r');
password.AppendChar('t');
password.AppendChar('y');
password.AppendChar('1');
password.AppendChar('2');
password.AppendChar('3');
var alg = new Gost3410AsymmetricAlgorithm(cspParameters);
alg.SetContainerPassword(password);
Далее, например, в случае с подписью XML:
xml.SigningKey = alg;
xml.ComputeSignature();
from gostcryptography.
Да. При подписи xml все прекрасно работает и окно ввода пароля не появляется. А вот при дешифрации каждый раз запрашивается пароль. Ума не приложу, как его задать программно.
from gostcryptography.
А можете кусочек кода с примером, который воспроизводит ситуацию? ;)
from gostcryptography.
Забял сказать, что у класса CspParameters
также есть свойство для установки пароля. Можно попробовать использовать его.
cspParameters.KeyPassword = password;
Это нужно сделать соответственно до создания алгоритма.
from gostcryptography.
Пример кода (вчера не получилось ответить - немного приболел...). Указание пароля в cspParamets также не помогло.
XmlDocument doc = new XmlDocument();
var fileName = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location),
@"XmlFile1.xml");
doc.Load(fileName);
var exml = new GostEncryptedXml(doc);
X509Certificate2 Certificate = GetCertByNum("01 d1 fe a4 65 b3 f8 40 00 00 00 0d 00 05 00 01");
var cspParam = X509CertificateHelper.GetPrivateKeyInfo(Certificate);
System.Security.SecureString ss = new System.Security.SecureString();
for (int i = 0; i < "1234567890".Length; i++)
{
ss.AppendChar("1234567890".ToCharArray(i, 1)[0]);
}
cspParam.KeyPassword = ss;
Gost3410AsymmetricAlgorithm alg = new Gost3410AsymmetricAlgorithm(cspParam);
alg.SetContainerPassword(ss); //При вычислении ЭЦП установка пароля прекрасно работает
exml.AddKeyNameMapping("KeyName1", alg); // Возможно тут я делаю, что-то неправильно
exml.DecryptDocument(); // появляется окно ввода пароля.
Зашифрованная xml и сертификат (если нужно) [https://1drv.ms/u/s!AopaN--FViu5a-002UWBgxSkVkI]
from gostcryptography.
Я создал self-signed сертификат (реального у меня, к сожалению, нет). Установил его во вновь созданный контейнер VipNet. В настройках контейнера указал, что пароль доступа нужно сохранить на компьютере и не запрашивать при доступе к контейнеру (см. ниже). После этого выполнил тест https://github.com/AlexMAS/GostCryptography/blob/master/Source/GostCryptography.Tests/Xml/Encrypt/EncryptedXmlCertificateTest.cs#L22 Все прошло успешно, без запроса пароля.
Я не знаю, безопасно ли хранить пароль к контейнеру таким образом. Даже если не хранить, его придется как-то получать в коде вашей программы, например, из конфигурационного файла приложения.
Сейчас попробую удалить пароль и воспроизвести вашу ситуацию.
from gostcryptography.
Да, после того, как я указал, что пароль доступа не нужно хранить, я смог воспроизвести вашу ситуацию. Я попробовал разные способы, но у меня так и не получилось заставить GostEncryptedXml
работать без окна ввода пароля (в отличие от ЭЦП). Возможно, есть способ сделать это через CryptoAPI и указать пароль программно, как в случае с методом SetContainerPassword()
класса Gost3410AsymmetricAlgorithm
, но я не знаю, как, слишком мало информации по этому поводу.
По всей видимости, единственный возможный способ отключить диалог - это сохранить пароль доступа, как указанно в предыдущем ответе. Подойдет ли такой вариант решения вопроса? Также буду благодарен, если вы скажите, как в итоге решили проблему. :)
from gostcryptography.
Меня бы устроил такой вариант хранения пароля, но проблема в том, что доступ к контейнеру будет осуществляться через сервис, развернутый в IIS. А при обращении сервиса к контейнеру пароль, заданный для пользователя не подходит, и запрашивается заново + также окно для ввода пароля не появляется на экране, а выводится где-то там, внутри IIS-ки. Если, хотя бы окно появлялось, можно было бы поставить галку "Сохранить пароль" и при следующих операциях дешифровка проходила бы без проблем...
from gostcryptography.
Всё практически так, как вы себе и представляете.
Имеется веб-приложение развернутое на сервере IIS. Пользователь отправляет ему xml, которая подписывается ЭЦП и оборачивается в сообщение, которое в зашифрованном виде передаётся на сторонний сервис, далее веб приложение дешифрует ответ от стороннего сервиса и возвращает ответ пользователю. (пароль от сертификата хранится в файле конфигурации веб-приложения)
Подпись и дешифрация проходят на одном сертификате.
Буду крайне благодарен, если поможете разобраться )
from gostcryptography.
@DPonomarchuk, у вас получилось добиться успеха?
from gostcryptography.
Спасибо за информацию. Хорошо, что нашелся рабочий способ решить проблему, пускай даже таким образом. К сожалению, механизмы работы с криптографией в .NET Framework не назовешь удобными, особенно, когда речь заходит о криптографии по ГОСТ. Надеюсь в .NET Standard 2+ появятся более гибкие механизмы расширения. С программной реализацией указания пароля постараюсь разобраться в ближайшее время, правда, не уверен, что смогу это сделать, судя по тому, что мне удалось вспомнить.
from gostcryptography.
Related Issues (20)
- Верефикация нескольких сигнатур в файле
- Расшифровка с помощью сертификата HOT 2
- Подпись сообщений в веб-приложении (IIS) HOT 5
- Утечки памяти в GostCryptography HOT 4
- .netcore HOT 7
- Ошибка подписания при работе с КриптоПРО
- ЭЛН 2.0 HOT 90
- Реализация под Net 5 HOT 7
- VipNet 4.4.2 создает провайдеры с типом 75, 80 и 81 HOT 1
- Поддержка префиксов в xmldsig
- Верификация подписи ГОСТ Р 34.10-2012, 256 бит. HOT 3
- Принудительное шифрование XML по ГОСТ 2001 HOT 3
- Отправка запроса на получение "Уведомление об изменении ЭЛН".
- ComputeSignature Exception HOT 8
- Создание симметричных ключей для тестов HOT 5
- Алгоритм ключа сертификата не поддерживается HOT 1
- Взаимодействие с федеральными сервисами. Формирование jwt токена с использованием GOST3410. HOT 7
- Как расшифровать текст при помощи алгоритма ассиметричного ключа HOT 10
- Поддержка ГОСТ 34.12-2018 HOT 7
- Unknown algorithm '1.2.643.7.1.1.1.1' HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gostcryptography.