2015-12-22 4 views
0

Я пока не разбираюсь в delphi, но на основе некоторых примеров мне удалось создать простой HTTP-сервер с не более чем 10 пользователями.
Есть две основные проблемы, которые я не знаю, как решить.создание idhttpserver с ssl-шифрованием

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

Любой пример, который я нашел в связи с idhttpserver и openssl, был не совсем полным или со старой версией Indy.

В настоящее время я работаю с Delphi XE2 с компонентами Indy 10.

+0

Новые версии Indy можно загрузить из репозитория проекта Инди на http://www.indyproject.org/sockets/download/svn.en.aspx (XE2 довольно старая, так что новая Инди версия включает в себя множество ошибок исправлений и улучшений) – mjn

+0

ну, я буду придерживаться XE2 на некоторое время. Удивительно, но когда я посетил ваш адрес в indyproject, я решил вернуться к старому хорошему форуму. прочитав проблему, связанную с обработчиком openssl, я заметил - догадался, что я слишком слепо следую за другим примером, добавив неверно некоторые параметры VerifyMode. так как-то я получил ssl режим запуска э ... вероятно, должен переписать вопрос –

+1

@mjn: не забывайте http://www.indyproject.org/sockets/Docs/Indy10Installation.aspx, в котором есть важные примечания по установке. Для XE2 в частности: «* ошибочная зависимость от Indy была идентифицирована в пакете dclnet160.bpl от Embarcadero. Установка новой версии Indy приведет к тому, что этот пакет не будет правильно загружаться в среде IDE, предотвращая все содержащиеся в нем компоненты (такие как THTTPRIO, TXMLDocument, TWeb \ * Dispatcher, T \ * Producer, TTcp \ *, TUdp \ *), а также Wizards и Property Editors для них, начиная с момента разработки. * " –

ответ

3

правильный способ аутентификации, управления пользователями - сеансы

TIdHTTPServer управляет HTTP сессий для вас, если вы установите TIdHTTPServer.SessionState свойство истинно (ложно по умолчанию). TIdHTTPServer использует файлы cookie для управления сеансом, поэтому вашим клиентам необходимо включить файлы cookie.

Аутентификация должна выполняться вручную, но как вы это делаете, зависит от того, используют ли ваши клиенты HTTP-аутентификацию или проверку подлинности на основе HTML.

Для аутентификации HTTP существует ARequestInfo.UserName и ARequestInfo.Password объектов. Если недействительно, отправьте соответствующий ответ 401 обратно клиенту (если вы установите для свойства AResponseInfo.AuthRealm непустую строку, TIdHTTPServer отправит вам ответ 401). По умолчанию TIdHTTPServer поддерживает только аутентификацию BASIC. Если вы хотите поддерживать другие схемы аутентификации, вам нужно будет использовать событие TIdHTTPServer.OnParseAuthentication и отправить ответ 401 вручную, чтобы вы могли отправить соответствующие заголовки WWW-Authenticate. В любом случае, если клиент проверен, вы можете использовать сеансы HTTP, чтобы клиент регистрировался между запросами. Объекты AResponseInfo.Session и AResponseInfo.Session указывают на текущий сеанс. Если TIdHTTPServer.AutoStartSession истинно (по умолчанию оно ложно), TIdHTTPServer автоматически создает новые сеансы. В противном случае вы можете позвонить по телефону TIdHTTPServer.CreateSession() самостоятельно, если это необходимо. TIdHTTPSession имеет свойство Content, в котором вы можете хранить данные, относящиеся к сеансу. Или вы можете получить новый класс из TIdHTTPSession, а затем использовать событие TIdHTTPServer.OnCreateSession для создания экземпляров этого класса.

Для аутентификации HTML, у вас есть два варианта, в зависимости от того, как настроить HTML:

  1. если ваш HTML <form> тег не имеет атрибут enctype, или он установлен в application/x-www-webform-urlencoded, TIdHTTPServer будет хранить необработанные данные веб-формы в свойстве ARequestInfo.FormParams, и если значение TIdHTTPServer.ParseParams истинно (по умолчанию оно), данные также будут проанализированы в свойстве ARequestInfo.Params.

  2. если ваш HTML <form> тег имеет enctype набор атрибутов для multipart/form-data, вам придется разобрать содержание ARequestInfo.PostStream вручную, так как TIdHTTPServer еще не обрабатывает эти данные для вас (примеры были перед вывесили много раз на многих различные форумы о том, как вручную анализировать эти данные, используя класс Indy's TIdMessageDecoderMIME). По умолчанию ARequestInfo.PostStream указывает на объект TMemoryStream. Вы можете использовать событие TIdHTTPServer.OnCreatePostStream, чтобы создать экземпляр другого класса, отличного от TStream, при желании.

главная проблема, соединение должно быть безопасным, поэтому требуется шифрование SSL, как это осуществить?

Перед запуском сервера:

  1. назначить TIdServerIOHandlerSSLBase -derived компонент, такой как TIdServerIOHandlerSSLOpenSSL, к TIdHTTPServer.IOHandler собственности и настроить его по мере необходимости (сертификат, проверки, равный SSL версии (ы), и т.д). В случае OpenSSL вам необходимо будет развернуть два файла библиотеки OpenSSL libeay32.dll и ssleay32.dll (или эквиваленты платформы не для Windows) с вашим приложением, если они еще не были предварительно установлены на целевой ОС или если вы хотите обеспечить приложение использует определенную версию OpenSSL. В это время OpenSSL - единственное шифрование, которое Indy поддерживает изначально, но существуют сторонние решения, совместимые с Indy, такие как EldoS SecureBlackbox.

  2. заполните TIdHTTPServer.Binding недвижимость со связующим для вашего желаемого порта HTTPS (443 - это порт HTTPS по умолчанию). Как правило, вы должны создать 2 привязки, один для HTTP-порта 80 и один для порта HTTPS 443. Внутри обработчиков OnCommand..., если вы получаете запрос, требующий шифрования SSL/TLS, вы можете проверить порт, на который был сделан запрос (AContext.Binding.Port) и если не HTTPS, то перенаправит (AResponseInfo.Redirect()) клиент для повторного запроса запроса на порт HTTPS.

  3. назначить обработчик к событию TIdHTTPServer.OnQuerySSLPort и он установил свой параметр VUseSSL Истину, если его параметр APort соответствует вашему порту HTTPS.

 Смежные вопросы

  • Нет связанных вопросов^_^