[英]creating idhttpserver with ssl encryption
我對delphi不太滿意,但是基於一些示例,我設法創建了一個不超過10個用戶的簡單http服務器。
有2個主要問題,我尚不知道如何解決。
我發現的與idhttpserver和openssl有關的任何示例都不十分完整,也與Indy的舊版本無關。
我目前正在使用帶有Indy 10組件的Delphi XE2。
驗證,管理用戶的正確方法-會話
TIdHTTPServer
為您管理HTTP會話,如果你設置的TIdHTTPServer.SessionState
屬性為true(這是默認為false)。 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
為true(默認情況下為false),則TIdHTTPServer
自動創建新會話。 否則,您可以在需要時自己調用TIdHTTPServer.CreateSession()
。 TIdHTTPSession
具有一個Content
屬性,您可以在其中存儲特定於會話的數據。或者您可以從TIdHTTPSession
派生一個新類,然后使用TIdHTTPServer.OnCreateSession
事件創建該類的實例。
對於HTML身份驗證,根據配置HTML的方式,您有兩種選擇:
如果您的HTML <form>
標記不具有enctype
屬性,或者將其設置為application/x-www-webform-urlencoded
,則TIdHTTPServer
會將原始ARequestInfo.FormParams
表單數據存儲在ARequestInfo.FormParams
屬性中,並且TIdHTTPServer.ParseParams
為true (默認情況下),數據也將為您解析到ARequestInfo.Params
屬性中。
如果您的HTML <form>
標記的enctype
屬性設置為multipart/form-data
,那么您將必須手動解析ARequestInfo.PostStream
的內容,因為TIdHTTPServer
尚未為您解析該數據(示例已發布多次)在許多不同的論壇上討論過如何使用Indy的TIdMessageDecoderMIME
類手動解析該數據)。 默認情況下, ARequestInfo.PostStream
指向TMemoryStream
對象。 如果需要,可以使用TIdHTTPServer.OnCreatePostStream
事件創建不同的TStream
派生類的實例。
主要問題是,連接必須安全,因此需要SSL加密,如何實現?
激活服務器之前:
將TIdServerIOHandlerSSLBase
派生的組件(例如TIdServerIOHandlerSSLOpenSSL
分配給TIdHTTPServer.IOHandler
屬性,並根據需要進行配置(證書,對等驗證,SSL版本等)。 對於OpenSSL,如果尚未在目標OS上預先安裝2個OpenSSL庫二進制文件libeay32.dll
和ssleay32.dll
(或非Windows平台等效文件),則必須將它們與應用程序一起部署。希望確保您的應用使用特定版本的OpenSSL。 目前,OpenSSL是Indy本地支持的唯一加密方法,但是有可用的與Indy兼容的第三方解決方案,例如EldoS SecureBlackbox 。
填寫TIdHTTPServer.Binding
屬性,並TIdHTTPServer.Binding
綁定所需的HTTPS端口(443是默認的HTTPS端口)。 通常,您應該創建2個綁定,一個用於HTTP端口80,一個用於HTTPS端口443。在OnCommand...
處理程序中,如果收到要求進行SSL / TLS加密的請求,則可以檢查該請求是在哪個端口上進行的。 ( AContext.Binding.Port
),如果不是HTTPS,則重定向( AResponseInfo.Redirect()
),客戶端在HTTPS端口上重試請求。
為TIdHTTPServer.OnQuerySSLPort
事件分配一個處理程序,並使其APort
參數與您的HTTPS端口匹配時,將其VUseSSL
參數設置為True。 從SVN版本5461開始更新 ,如果您唯一的HTTPS端口是443 ,則不再需要 OnQuerySSLPort
處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.