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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Ruslan  
#1 Оставлено : 14 ноября 2008 г. 18:10:09(UTC)
Ruslan

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

Группы: Участники
Зарегистрирован: 16.10.2008(UTC)
Сообщений: 33

Здраствуйте, у меня такая ситуация. Я пишу веб-сервис. Доступ к веб-сервису закрыт аутентификацией windows. Тоесть прежде чем обратиться к методу веб-сервиса пользователь должен авторизоваться указав свой логи и пароль. Теперь этот пользователь имеет доступ только к тем ресурсам компьютера, которые доступны ему в соответсвии с его уровнем прав.
В коде веб-сервиса я осуществляю поиск сертификатов в личном хранилище сертификатов данного пользователя.

Цитата:


// Ищем сертификат по имени его владельца


string User = "Имя текущего пользователя Веб-сервиса";

// Получаем хранилище сертификатов данного пользователя
X509Store storeMy = new X509Store(StoreName.My, StoreLocation.CurrentUser);
storeMy.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);

// Находим в личном хранилище данного пользователя все сертификаты, в которых есть информация с Именем текущего пользоватяля
X509CertificateCollection foundCertColl = storeMy.Certificates.Find(X509FindType.FindBySubjectName, User, false);



И тут выявляется странная закономерность. Когда пользователь Залогонен на сервере на котором работает веб-сервис, и через веб-сервис просматривает своё хранилище сертификатов, то сертификат в личном хранилище пользователя находится. А когда пользователь НЕ Залогонен на сервере, и обращается к веб службе с другого компьютера, то X509CertificateCollection foundCertColl=0 !!!

У меня возникает логичный вопрос! Почему так происходит!?

1) Возможно я не задал какие-нибудь дополнительные значения для доступа к личному хранилищу сертификатов? И по этому у меня такие глюки...
2) Или же для того что бы программно иметь доступ к личному хранилищу пользователя, нужно что бы пользователь неприменно был залогонен на той машине, на которой находится это самое хранилище сертификатов.

!!!!Какие условия должны быть соблюдены для программного доступа к личному хранилищу сертификатов пользователя?!!!!

И ещё! Что из себя представлят Хранилище сертификатов? Это какие-то ветки реестор? Или папки? Может быть есть другой способ к нему обратиться?
Offline Челпанов А.  
#2 Оставлено : 14 ноября 2008 г. 18:52:26(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Login на сервер открывает доступ к своему профайлу. Обычная авторизация на веб-сервисе не дает доступа к нему.
Store "MY" хранится в профеле пользователя и соответственно синхронизуется на разных компьютерах для одного пользователя.
А Вам действительно требуется доступ из Web сервиса к Store "MY"? Зачем? Если уж совсем необходимо (мне кажется что это совсем экзотические ситуации) иметь store пользователя на сервере, то придется делать RevertToSelf, подгружать профайл...

P.S. Секретные ключи пользователя (в реестре) лежат не в профайле.
С уважением, Александр.
Offline Ruslan  
#3 Оставлено : 14 ноября 2008 г. 20:05:52(UTC)
Ruslan

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

Группы: Участники
Зарегистрирован: 16.10.2008(UTC)
Сообщений: 33

Спасибо большое за ответ! :-)

ReverToSelf Это что такое? Откуда и с чем его едят? Можно чуть чуть по подробнее.. в каком направлении капать? Как этот профайл подгрузить?

PS: А почему вы считаете эту ситуацию экзотической? Пользователь работает в ИнтрАнете. Есть служба дающая ему возможность воспользоваться сертификатом из своего персоонального хранилища, что бы подписать какую-то созданную им информацию. По моему всё очень логично. Тем более что служба виндовс-аутенитификации гарантирует, что это тот самый пользователь.

Где в реестре лежат сектретные ключи и как к ним обращаться.. Честно говоря не знаю! Это конечно тоже способ.. но на мой взгляд не совсем верный. Раз уж в Microsoft создали хранилище сертификатов, то имеет смысл им пользоваться.

Отредактировано пользователем 14 ноября 2008 г. 20:09:44(UTC)  | Причина: Не указана

Offline Челпанов А.  
#4 Оставлено : 14 ноября 2008 г. 20:52:49(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
1.
Код:
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool RevertToSelf();

2. Для подписи требуется секретный ключ, а не открытый. Подписывать пользователь должен информацию на своем рабочем месте, секретным ключем, который дальше его компьютера не уходит; при этом секретный ключ он может выбирать на основе сертификата, который так же находится в store на его рабочем месте. Ситуации, когда подпись осуществляется не на рабочем месте - экзотические, за некоторым исключением, это компрометация секретного ключ
С уважением, Александр.
Offline Dmitry Kolchev  
#5 Оставлено : 17 ноября 2008 г. 0:44:05(UTC)
Dmitry Kolchev

Статус: Новичок

Группы: Участники
Зарегистрирован: 05.11.2008(UTC)
Сообщений: 5
Откуда: Moscow

Скорее всего имеется ввиду имперсонификация для доступа к профилю соответсвующей учетной записи. Необходимо смотреть классы WindowsIdentity и WindowsImpersonationContext в пространстве имен System.Security.Principal

Offline Ruslan  
#6 Оставлено : 17 ноября 2008 г. 15:41:53(UTC)
Ruslan

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

Группы: Участники
Зарегистрирован: 16.10.2008(UTC)
Сообщений: 33

Челпанов А. написал:
1.
Код:
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool RevertToSelf();

2. Для подписи требуется секретный ключ, а не открытый. Подписывать пользователь должен информацию на своем рабочем месте, секретным ключем, который дальше его компьютера не уходит; при этом секретный ключ он может выбирать на основе сертификата, который так же находится в store на его рабочем месте. Ситуации, когда подпись осуществляется не на рабочем месте - экзотические, за некоторым исключением, это компрометация секретного ключ


Как я понял метод RevertToSelf(); выполняет "The RevertToSelf function terminates the impersonation of a client application."

В моем случае это означет следующее:
Пользователь обращается в Web-службе. Проходит через Windows-аутенитификацию. И теперь код веб-службы выполняется с правами пользователя. В коде выполняется метод RevertToSelf(); и Windows-аутенитификация сбрасывается.

Проверить можно на следующем примере:

Код:


using System.Security.Principal;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool RevertToSelf();

    public Service () {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    public string SignListItem(string ItemID, string ListID)
    {
//Получаем данные о первой учётной записи, которая выполнила Windows-аутентификацию
        WindowsIdentity wid = WindowsIdentity.GetCurrent();
        string Message = wid.Name;
//Выполняем terminates the impersonation of a client application.
        RevertToSelf();
// Windows-аутентификация сбрасывается и мы можем увидить под какой учётной записью выполняется web-сервис. Кстати в хранилище сертификатов этой учётной записи я сертификаты нахожу.
        WindowsIdentity widDefault = WindowsIdentity.GetCurrent();
        Message += widDefault.Name;
}


А как подгрузить профайл первой учётной записи, которая выполнила Windows-аутентификацию?? Мне нужно простучаться в её хранилище!
Offline Челпанов А.  
#7 Оставлено : 17 ноября 2008 г. 16:25:14(UTC)
Челпанов А.

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

Группы: Участники
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 390
Мужчина
Откуда: КриптоПро

Поблагодарили: 2 раз в 2 постах
Спасибо "Dmitry Kolchev" за WindowsImpersonationContext.
Средств прогрузки профиля, отличных от LogonUser мне не известно. Для того чтобы вы могли вызвать LogonUser скорее всего придется вызывать RevertToSelf, иначе прав не хватит.
И самое главное. Хранение секретных ключей пользователя на сервере - неправильно, недоказуемо, криво...
Повторюсь.
Подписывать пользователь должен информацию на своем рабочем месте, секретным ключем, который дальше его компьютера не уходит; при этом секретный ключ он может выбирать на основе сертификата, который так же находится в store на его рабочем месте. Ситуации, когда подпись осуществляется не на рабочем месте - экзотические, за некоторым исключением, это компрометация секретного ключ

Отредактировано пользователем 17 ноября 2008 г. 16:26:36(UTC)  | Причина: Не указана

С уважением, Александр.
Offline Ruslan  
#8 Оставлено : 17 ноября 2008 г. 16:46:49(UTC)
Ruslan

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

Группы: Участники
Зарегистрирован: 16.10.2008(UTC)
Сообщений: 33

Челпанов А. написал:
Спасибо "Dmitry Kolchev" за WindowsImpersonationContext.
Средств прогрузки профиля, отличных от LogonUser мне не известно. Для того чтобы вы могли вызвать LogonUser скорее всего придется вызывать RevertToSelf, иначе прав не хватит.
И самое главное. Хранение секретных ключей пользователя на сервере - неправильно, недоказуемо, криво...
Повторюсь.
Подписывать пользователь должен информацию на своем рабочем месте, секретным ключем, который дальше его компьютера не уходит; при этом секретный ключ он может выбирать на основе сертификата, который так же находится в store на его рабочем месте. Ситуации, когда подпись осуществляется не на рабочем месте - экзотические, за некоторым исключением, это компрометация секретного ключ


Большое спасибо Челпанов А. за дельные советы и пояснения :-)

Спасибо "Dmitry Kolchev" за WindowsImpersonationContext.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.