Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline vadjunik  
#1 Оставлено : 21 августа 2017 г. 12:10:08(UTC)
vadjunik

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.12.2016(UTC)
Сообщений: 127
Мужчина
Российская Федерация
Откуда: Таганрог

Сказал «Спасибо»: 15 раз
День добрый, коллеги!
Т.к. существующие штатные средства не помогли, вынужден решать свою задачу с автоматический выдачей сертификатов, уже программным способом.

Уточняю архитектуру системы.
1) Клиенты формируют запрос на сертификат в стандартном формате PKCS#10, через различные механизмы в браузере (плагины всякие).
2) Запрос приходит на сервер, на котором живет наше приложение, одной из функций которого является обеспечение автоматизированной выдачи сертификат для электронной подписи документов.
3) Серверная часть отсылает запрос на сертификат от имени существующего пользователя УЦ.
4) Получает сертификат и отсылает его клиенту.

В локальной сети серверной части присутствует КриптоПро УЦ 2.0. Наше серверное приложение по факту является физически одним единственным его пользователем (ну в своем контексте). Т.е., если я правильно понимаю, правомерно запрашивать выдачу сертификатов по файлам запросов, указывая в качестве пользователя УЦ администратора УЦ ?

Пытаюсь отправить запрос на УЦ, вот так (С#), согласно документации (ЖТЯИ.00078-01 90 05. ПАК . Руководство программиста):
Код:

string requestFile = "PKCS#10_file_data";
byte[] requestFileRAW = Encoding.UTF8.GetBytes(requestFile);

HttpWebRequest rqst = (HttpWebRequest)WebRequest.Create("https://" + CA_SERVER + "/ui/2/api/certrequest");
rqst.Method = "POST";
rqst.UserAgent = "UrlRetriever {Mozilla MSIE 6 Win 2000}";
rqst.KeepAlive = true;
rqst.ContentType = "application/octet-stream";
rqst.ContentLength = requestFileRAW.Length;
rqst.Headers.Add("Authorization", "Basic/ 1b27843a13abbf8f019cce738a115de115c6d940=="); //  Отпечаток сертификата администратора ЦС.
rqst.ClientCertificates.Add(cert); // cert - сертификат корневого УЦ, размещенный в системном хранилище доверенных корневых ЦС

Stream dataStream = rqst.GetRequestStream();
dataStream.Write(requestFileRAW, 0, requestFileRAW.Length);                
dataStream.Close();

// Получаем ответ
HttpWebResponse response = (HttpWebResponse)rqst.GetResponse();

// Читаем ответ
Stream responseStream = response.GetResponseStream();
StreamReader readStream = new StreamReader(responseStream);

List<object> list = new List<object>();
string currResponse = readStream.ReadToEnd();
list.Add(currResponse);     

foreach(string s in list) {
	Console.WriteLine(s);
}


Понятно, что само тело запроса - фонарь, но по идее я должен же получить какой-то вразумительный ответ на это? А приходит web-страница логина на УЦ!

Шо делать, куда копать?!
Потом еще один странный момент. До первого корректного указания отпечатка сертификата в атрибуте Authorization получаю строго 401-ю ошибку, в вот потом - можно менять параметры авторизации как угодно - все ОКейно! Думал может сокет зависает - так нет, корректно умирает (смотрел при помощи TCPview).
Offline Kirill Sobolev  
#2 Оставлено : 22 августа 2017 г. 14:40:12(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Здравствуйте

Физически приложение является оператором УЦ, а вот пользователей УЦ как раз много - каждый клиент фактически является пользователем.
Поэтому подход "запрашивать выдачу сертификатов по файлам запросов, указывая в качестве пользователя УЦ администратора УЦ" работать не будет.
И по этой причине не получится использовать httpApi, для Вашей задачи нужно использовать ИВП УЦ 2.0.
Техническую поддержку оказываем тут
Наша база знаний
Offline vadjunik  
#3 Оставлено : 22 августа 2017 г. 15:21:34(UTC)
vadjunik

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.12.2016(UTC)
Сообщений: 127
Мужчина
Российская Федерация
Откуда: Таганрог

Сказал «Спасибо»: 15 раз
Спасибо за отклик!

Автор: Kirill Sobolev Перейти к цитате
пользователей УЦ как раз много - каждый клиент фактически является пользователем
Я правильно понимаю, что каждый клиент моей системы в итоге должен быть зарегистрирован как пользователь УЦ? Я видел пример кода на VB.NET где создается запрос в формате PKCS#10, потом подписывается и отправляется на УЦ. Как раз думаю в направлении - если я возьму "извне" (от клиента) этот запрос уже в виде файла, подпишу его при помощи сертификата Администратора УЦ (он же оператор?) и отправлю УЦ за сертификатом, то такой вариант сработает? Ко мне кроме самого файла запроса приезжает имя клиента (сейчас пока используется MS ЦС, и он регистрируется как пользователь в ЦС), т.е. мне помощи ИВП так же при надо предварительно зарегистрировать нового пользователя УЦ?

Отредактировано пользователем 22 августа 2017 г. 15:24:06(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#4 Оставлено : 23 августа 2017 г. 16:21:21(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Совершенно верно.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Кирилл Соболев за этот пост.
vadjunik оставлено 24.08.2017(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.