-
Delphi 7, IdHTTPServer, IdServerIOHandlerSSLOpenSSL, OpenSSL 0.9.8g (или 0.9.6m, не принципиально)
цель - если запрос был отклонен при проверке сертификата, нужно сохранить информацию о нем - IP и содержание запроса
насколько я понимаю, для ручной проверки сертификата можно использовать событие OpenSSLVerifyPeer компонента IdServerIOHandlerSSL. но в качестве входных параметров там только сертификат и результат его проверки библиотекой OpenSSL. никакие данные самого HTTP запроса в этом обработчике не доступны
если запрос, не прошедший проверку, все же пропустить принудительно и установить некий флаг отказа, то потом текст запроса можно получить в IdHTTPServer.CommandGet. но нет никакой гарантии, что при большом количестве запросов они будут поступать на эти обработчики в одном и том же порядке :(
-
laao (31.07.08 13:01) и результат его проверки библиотекой OpenSSL. никакие данные самого HTTP запроса в этом обработчике не доступны Правильно, т.к. до HTTP запроса еще не дошло... Чтобы дошло до HTTP запроса нужен "правильный" сертификат
-
Slym © (31.07.08 13:04) [1] Сначала устанавливается шифрованный SSL тунель (но ты его обрываешь в OpenSSLVerifyPeer), а уж потом по тунелю идут данные - в твоем случае HTTP запрос\ответ
-
Slym
я понимаю. но я готов в OpenSSLVerifyPeer пропускать далее все запросы, но как мне "пометить" те, которые не прошли проверку сертификатов, чтобы в дальнейшем отловить их в IdHTTPServer.CommandGet ?
-
версия Indy какая? если дефолтовая 9 то навскидку так procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); begin if AThread.Connection.Socket is TIdSSLIOHandlerSocket then TIdSSLIOHandlerSocket(AThread.Connection.Socket).SSLSocket.PeerCert.Subject end;
-
спасибо !
у меня indy 10.1.5
метод IdHTTPServer выглядит так - IdHTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
соответственно, обращаюсь к сертификату так - (AContext.Connection.Socket as TIdSSLIOHandlerSocketOpenSSL).SSLSocket.PeerCert. ....
|