Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> авторизация(проверка сертификата) на своём сайте, idhttps+certificate 
:(
    Опции темы
GhoulZEA
Дата 29.9.2011, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.9.2011

Репутация: 1
Всего: 1



Delphi 2010
 Делаю Web-сервер через idHTTPServer.
 Сейчас процесс авторизации выглядит так:
 Человек вставляет e-token, стучится на сайт. Сервер через IOHandler (TIdServerIOHandlerSSLOpenSSL) реагирует на событие и вызывает функцию OnVerifyPeer,
Код

function TForm1.sslOpenVerifyPeer(Certificate: TIdX509; AOk: Boolean; ADepth: Integer): Boolean;

 где проверяется отпечаток ключа. Если ключ нормальный и существует, то функция возвращает True и авторизация продолжается. Сервер в процедуре idHTTPServerCommandGet запрашивает логин и пароль
Код

if not (ARequestInfo.AuthExists)or(ARequestInfo.AuthExists) then ...

 Получается, что проверка сертификата оторвана от проверки логина и человек (у которого есть подлинный сертификат) может зайти под любым логином.
 Можно ли получить какой-либо идентификатор человека/сессии в sslOpenVerifyPeer, по которому можно будет однозначно опознать его в процедуре idHTTPServerCommandGet? К примеру IP?
PM MAIL   Вверх
~FoX~
Дата 30.9.2011, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 3
Всего: 68



Насколько я помню, однозначное опознавание, чаще всего, происходит по МАК адресу.... 



--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
GhoulZEA
Дата 2.10.2011, 14:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.9.2011

Репутация: 1
Всего: 1



Да вся проблема в том, что процедура onVerifyPeer не получает ничего кроме сертификата. Т.е. в ней я однозначно могу сказать, что у такого-то сертификат в норме и разрешаю ему входить. А вот как после этого идентифицировать (и назначить права) человека в idHTTPserver не знаю :(
PM MAIL   Вверх
Drug51
Дата 15.11.2016, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.11.2016

Репутация: нет
Всего: нет



Цитата(GhoulZEA @ 29.9.2011,  06:38)
Delphi 2010
 Делаю Web-сервер через idHTTPServer.
 Сейчас процесс авторизации выглядит так:
 Человек вставляет e-token, стучится на сайт. Сервер через IOHandler (TIdServerIOHandlerSSLOpenSSL) реагирует на событие и вызывает функцию OnVerifyPeer,
Код

function TForm1.sslOpenVerifyPeer(Certificate: TIdX509; AOk: Boolean; ADepth: Integer): Boolean;

 где проверяется отпечаток ключа. Если ключ нормальный и существует, то функция возвращает True и авторизация продолжается. Сервер в процедуре idHTTPServerCommandGet запрашивает логин и пароль
Код

if not (ARequestInfo.AuthExists)or(ARequestInfo.AuthExists) then ...

 Получается, что проверка сертификата оторвана от проверки логина и человек (у которого есть подлинный сертификат) может зайти под любым логином.
 Можно ли получить какой-либо идентификатор человека/сессии в sslOpenVerifyPeer, по которому можно будет однозначно опознать его в процедуре idHTTPServerCommandGet? К примеру IP?

Подскажите, решили ли проблему? И каким образом вы получаете отпечаток? можно по подробней о sslOpenVerifyPeer
PM MAIL   Вверх
GhoulZEA
Дата 15.11.2016, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 26.9.2011

Репутация: 1
Всего: 1



Проблема более или менее была решена. Возможно не совсем правильно. По отпечатку ключа каждой персоне присваивался ip. А в CommandGet опрашивался ip и от этого уже работала.
А потом появилась другая smile Часть пользователей сидела за маршрутизатором и соответственно все они имели один внешний ip, но права должны были быть разными. Пришлось задействовать куки.
Правда уже прошло 5 лет и честно говоря я уже плохо помню что сделал. Из программы надёргал кусков.

Код

type
TIdSSLIOHandlerSocketOpenSSLA=class (TIdSSLIOHandlerSocketOpenSSL)
protected
  function DoVerifyPeer(Certificate: TIdX509; AOk: Boolean; ADepth: Integer): Boolean; override;//, AError
end;

TIdServerIOHandlerSSLOpenSSLA=class (TIdServerIOHandlerSSLOpenSSL)
    constructor Create(AOwner: TComponent);
    function Accept(ASocket: TIdSocketHandle; AListenerThread: TIdThread; AYarn: TIdYarn): TIdIOHandler; override;
    function VerifyPeerProc(Certificate: TIdX509; AOk: Boolean; ADepth: Integer): Boolean;//, AError
end;


Код

...
var
id2: TIdServerIOHandlerSSLOpenSSLA;
...


Код

constructor TIdServerIOHandlerSSLOpenSSLA.Create(AOwner: TComponent );
begin
  inherited Create(AOwner);
  OnVerifyPeer:=VerifyPeerProc;
end;

function TIdServerIOHandlerSSLOpenSSLA.VerifyPeerProc(Certificate: TIdX509; AOk: Boolean; ADepth: Integer): Boolean;//, AError
begin
  result:=true;
end;

function TIdServerIOHandlerSSLOpenSSLA.Accept(ASocket: TIdSocketHandle; AListenerThread: TIdThread; AYarn: TIdYarn): TIdIOHandler;
var
  LIO: TIdSSLIOHandlerSocketOpenSSLA;
  s: string;
begin
  Assert(ASocket<>nil);
  Assert(fSSLContext<>nil);
  LIO:=TIdSSLIOHandlerSocketOpenSSLA.Create(nil);
  LIO.PassThrough:=True;
  LIO.Open;
  if LIO.Binding.Accept(ASocket.Handle) then
  begin
    s:=LIO.Binding.PeerIP;
    FreeAndNil(LIO.fxSSLOptions);
    LIO.IsPeer:=True;
    LIO.fxSSLOptions:=fxSSLOptions;
    LIO.fSSLSocket:=TIdSSLSocket.Create(LIO);
    LIO.fSSLContext:=fSSLContext;
  end
  else FreeAndNil(LIO);
  Result:=LIO;
end;



Код

procedure TForm1.FormCreate(Sender: TObject);
...
// создаём хендлер ssl
  id2:=TIdServerIOHandlerSSLOpenSSLA.Create(self);
  IdHTTPServer.IOHandler:=id2;

  id2.SSLOptions.CertFile:='server.crt';
  id2.SSLOptions.KeyFile:='server.key';
  id2.SSLOptions.RootCertFile:='ca.crt';
  id2.SSLOptions.Method:=sslvTLSv1;//sslvSSLv3;
  id2.SSLOptions.Mode:=sslmBoth;
  id2.SSLOptions.VerifyDepth:=0;
  id2.SSLOptions.VerifyMode:=id2.SSLOptions.VerifyMode +[sslvrfPeer, sslvrfFailIfNoPeerCert, sslvrfClientOnce];
  id2.OnVerifyPeer:=IdSSLIOHandlerSocketOpenSSL1VerifyPeer;
...



Код

function TIdSSLIOHandlerSocketOpenSSLA.DoVerifyPeer(Certificate: TIdX509; AOk: Boolean; ADepth: Integer): Boolean;//, AError
var
  s,port: String;
...
  s:=self.binding.peerip;
  try
    port:=IntToStr(self.binding.PeerPort);
  except
    port:='0';
  end;
  L1:=Length(Certificate.Fingerprints.SHA1AsString);
  s:=Certificate.Fingerprints.SHA1AsString;
...


Код

procedure TForm1.idHTTPServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
...
RemoteIP:=ARequestInfo.RemoteIP;


PM MAIL   Вверх
Drug51
Дата 16.11.2016, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.11.2016

Репутация: нет
Всего: нет



GhoulZEA, Спасибо за оперативный ответ! smile  Вы заставили меня копать дальше))) smile  и вот ответ на вопрос. Думаю тема закрыта. smile  smile  smile 

Код


procedure TForm1.IdHTTPServerCommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
    Log('Fingerprints.SHA1=%s',[TIdSSLIOHandlerSocketOpenSSL(AContext.Connection.IOHandler).SSLSocket.PeerCert.Fingerprints.SHA1AsString]);   
end;


Это сообщение отредактировал(а) Drug51 - 16.11.2016, 12:08
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1233 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.